2016-09-27 59 views
2

我需要按如下方式列出客户名称对;在Oracle Sql上使用不同标准在同一个表上列出对

> CUSTOMER_FIRST_NAME, CUSTOMER_LAST_NAME, CUSTOMER_FIRST_NAME, CUSTOMER_LAST_NAME 

这样每对顾客都有相同的邮政编码(这也在customers表中)。

在任务有一个暗示它说

提示:您的输出应该有四列:CUSTOMER_FIRST_NAME,CUSTOMER_LAST_NAME,CUSTOMER_FIRST_NAME,CUSTOMER_LAST_NAME

这是我至今写的:

SELECT DISTINCT CUSTOMER_FIRST_NAME, CUSTOMER_LAST_NAME, CUSTOMER_FIRST_NAME, CUSTOMER_LAST_NAME 
FROM CUSTOMERS 
WHERE CUSTOMER_ZIP = CUSTOMER_ZIP 

但我不知道如何继续,因为我昨天才开始学习SQL。我也尝试加入导致歧义错误的同一张表。

更新#1: 我已经写了使用别名这个代码由@ kpater87的建议

SELECT DISTINCT C1.CUSTOMER_FIRST_NAME, C1.CUSTOMER_LAST_NAME , C2.CUSTOMER_FIRST_NAME, C2.CUSTOMER_LAST_NAME 
FROM CUSTOMERS C1 
INNER JOIN CUSTOMERS C2 
ON C1.CUSTOMER_ZIP = C2.CUSTOMER_ZIP 

但是,即使我有一个不同的声明,它会显示重复的数据。这是预料还是我错过了什么?

+1

提示:'JOIN','ON'。 –

+0

'JOIN'是一个正确的方向。你能否表明你的查询是在哪里出现歧义错误?可能你错过了列别名。 – kpater87

+0

Jojning同一张桌子是要走的路。您可能会遇到歧义错误,因为查询中有两个表具有相同的名称。您需要表别名,因此您可以将这两个表实例视为它们是不同的表。 –

回答

1

您的更新查询看起来很好。您的查询中唯一的问题是它将加入相同的记录。 如果你在表的主键,你可以通过添加WHERE条件提高查询:

SELECT DISTINCT C1.CUSTOMER_FIRST_NAME, 
    C1.CUSTOMER_LAST_NAME , 
    C2.CUSTOMER_FIRST_NAME, 
    C2.CUSTOMER_LAST_NAME 
FROM CUSTOMERS C1 
INNER JOIN CUSTOMERS C2 
ON C1.CUSTOMER_ZIP = C2.CUSTOMER_ZIP 
WHERE C1.PK <> C2.PK; 

PK - 是是在表的主键列。

如果没有主键,你可以试试这个:

SELECT C1.CUSTOMER_FIRST_NAME, 
    C1.CUSTOMER_LAST_NAME , 
    C2.CUSTOMER_FIRST_NAME, 
    C2.CUSTOMER_LAST_NAME 
FROM CUSTOMERS C1 
INNER JOIN CUSTOMERS C2 
ON C1.CUSTOMER_ZIP = C2.CUSTOMER_ZIP 
WHERE C1.CUSTOMER_FIRST_NAME <> C2.CUSTOMER_FIRST_NAME 
    AND C2.CUSTOMER_LAST_NAME <> C2.CUSTOMER_LAST_NAME 

但仍然是一个问题,在您的输出,你会得到如

Mary Smith James Bond 
James Bond Mary Smith 

要删除的排列:

SELECT C1.CUSTOMER_FIRST_NAME, 
    C1.CUSTOMER_LAST_NAME , 
    C2.CUSTOMER_FIRST_NAME, 
    C2.CUSTOMER_LAST_NAME, 
    C1.CUSTOMER_ZIP 
FROM T_CUSTOMERS C1 
LEFT JOIN T_CUSTOMERS C2 
ON (C1.CUSTOMER_ZIP = C2.CUSTOMER_ZIP 
    AND 
    C1.CUSTOMER_NUMBER > C2.CUSTOMER_NUMBER); 

参见:SQL: self join using each rows only once

+0

欢呼的答案,但我需要摆脱排列的行。应该有11个,但有22个。所以我清楚地知道我需要什么,但我需要摆脱排列。 – Mephistofee

+0

你有主键列吗? – kpater87

+0

是的,这将是CUSTOMER_NUMBER – Mephistofee

相关问题