在参加在线数据库课程(初学者)时,我注意到了一个问题,我必须找到涉及...... 至少两个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;部分将受到高度赞赏。
答案 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;