【问题标题】:Listing Pairs on same table with different criteria on Oracle Sql在 Oracle Sql 上列出具有不同标准的同一表上的对
【发布时间】:2016-09-28 04:45:16
【问题描述】:

我需要列出成对的客户姓名,如下所示;

> 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

但即使我有一个明确的声明,它也会显示重复的数据。这是意料之中的还是我错过了什么?

【问题讨论】:

  • 提示:JOINON
  • JOIN 是正确的方向。您能否在查询中显示您遇到歧义错误的地方?可能您缺少列别名。
  • 加入同一张桌子是要走的路。您可能会遇到歧义错误,因为您的查询中有两个同名的表。您需要表别名,因此您可以将两个表实例视为不同的表。
  • 因为您今天已经开始学习 SQL,我还将向您解释您从问题中查询的内容:WHERE CUSTOMER_ZIP = CUSTOMER_ZIPWHERE 1=1 相同,因此它始终为 TRUE,因此您选择所有记录。然后您选择 4 列:CUSTOMER_FIRST_NAME 两次和 CUSTOMER_LAST_NAME 两次同一客户。
  • @kpater87 我对 distinct 命令做错了吗?

标签: sql oracle


【解决方案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

【讨论】:

  • 为答案干杯,但我也需要摆脱排列后的行。应该有 11 个,但有 22 个。所以我显然有我需要的东西,但我需要摆脱排列。
  • 你有主键列吗?
  • 是的,应该是 CUSTOMER_NUMBER
  • 我已经编辑了我的答案。现在它正在做你需要的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-23
  • 2015-11-06
相关资源
最近更新 更多