SQL - 在另一个表上找到至少两个DISTINCT / SEPARATE / DIFFERENT值

时间:2014-03-11 17:36:54

标签: mysql sql database postgresql

在参加在线数据库课程(初学者)时,我注意到了一个问题,我必须找到涉及...... 至少两个DISTINCT值的查询...例如,< / p>

ELMASRI书中的COMPANY数据库说明:查找至少完成两个不同项目的所有员工。而解决方案(效果很好)是

SELECT DISTINCT LName FROM Employee e1
JOIN Works_On AS w1 ON (e1.Ssn = w1.Essn)
JOIN Works_On AS w2 ON (e1.Ssn = w2.Essn)
WHERE w1.Pno <> w2.Pno

同样,对于STUDENT / COURSE数据库(我忘记了来源):查找至少参加两门不同课程的学生的Student_ID 。解决方案看起来也很简单(虽然没有经过测试)

SELECT e1.Student_ID FROM Enroll AS e1, Enroll AS e2
WHERE e1.Student_ID = e2.Student_ID
AND e1.Course_ID <> e2.Course_ID

在我的问题中,我必须查找在至少两个不同类型的分支中拥有帐户的客户的名称和客户ID(即,不具有相同的分支类型)。 从下表(MySql)

CUSTOMER:            BRANCH:             ACCOUNT:
Cust_ID  Lname       Br_ID  Br_Type      Acc_Num  Br_ID  Cust_ID  Balance
-------  ------      -----  -------      -------  -----  -------  -------
1        Mr.A        10     big          1001     10     1        2000
2        Mr.B        11     small        1002     11     1        2500  
3        Mr.C        12     big          1003     13     1        3000
4        Mr.D        13     small        1004     12     2        4000 
                                         1005     13     3        4500
                                         1006     10     4        5000
                                         1007     12     4        6000

结果表应如下所示:

Lname  Cust_ID
-----  -------
Mr.A   1

只有Mr.A在一个类型为&#39; big&#39;以及类型为“小”的分支

我尝试了以下无法正常工作

SELECT DISTINCT c1.Lname, a1.Cust_ID FROM Customer AS c1
JOIN Account a1 ON (c1.Cust_ID=a1.Cust_ID)
JOIN Branch b1 ON (a1.Br_ID=b1.Br_ID)
JOIN Branch b2 ON (a1.Br_ID=b2.Br_ID)
WHERE b1.Br_Type<>b2.Br_Type;

我到底做错了什么?很抱歉这么长的描述,但我想确保这个问题是可以理解的,并对&lt; &GT;部分将受到高度赞赏。

2 个答案:

答案 0 :(得分:1)

您试图从相同的帐户记录中提取2个不同的分支记录 - 但这不会发生。您想要的是搜索具有不同类型的相关分支的2个不同帐户记录:

SELECT DISTINCT c1.Lname, a1.Cust_ID FROM Customer AS c1
JOIN Account a1 ON (c1.Cust_ID=a1.Cust_ID)
JOIN Account a2 ON (c1.Cust_ID=a2.Cust_ID)
JOIN Branch b1 ON (a1.Br_ID=b1.Br_ID)
JOIN Branch b2 ON (a2.Br_ID=b2.Br_ID)
WHERE b1.Br_Type<>b2.Br_Type;

SQLFiddle here

提供相同结果的更有效的方法是使用GROUP BY和HAVING COUNT(DISTINCT Br_Type) >= 2 - 这是@GordonLindoff提出的。

答案 1 :(得分:1)

您的查询问题是两个on条件。它们返回branch中的同一行,因为连接条件相同。

在任何情况下,我认为有更好的方式来考虑这些类型的查询(我称之为&#34; set - sets&#34;查询)。将这些视为聚合。在客户级别进行聚合,然后使用having子句过滤客户:

SELECT c.Lname, a.Cust_ID
FROM Customer AS c JOIN
     Account a
     ON c.Cust_ID = a.Cust_ID JOIN
     Branch b
     ON a.Br_ID = b.Br_ID
GROUP BY c.Lname, a.Cust_ID
HAVING count(distinct b.br_type) > 1;