我需要找到拥有帐户的客户的customerID Lonsdale分店,但在Robson没有。
Bank Schemata:
Customer = {customerID, firstName, lastName, birthDate, income}
Account = {accNumber, type, balance, rate, branchName}
▪ branchName is a foreign key referencing Branch
Owns = {customerID, accNumber}
▪ customerID and accNumber are foreign keys referencing Customer and Account
正确这样做是这样的:
SELECT O1.customerID
FROM Owns O1, Account A1
WHERE A1.accNumber = O1.accNumber AND
A1.branchName = 'Lonsdale'
EXCEPT
SELECT O2.customerID
FROM Owns O2, Account A2
WHERE A2.accNumber = O2.accNumber AND
A2.branchName = 'Robson'
但是,不正确的查询是这样的:
SELECT O1.customerID
FROM Owns O1, Account A1, Owns O2, Account A2
WHERE O1.customerID = O2.customerID AND
O1.accNumber = A1.accNumber AND
O2.accNumber = A2.accNumber AND
A1.branchName = 'Lonsdale' AND
A2.branchName <> 'Robson
查询实际上返回谁拥有不是Robson分支的帐户。我的问题是:为什么这个查询不起作用? (无论运行时间)。这个查询实际上发生了什么?
答案 0 :(得分:1)
原因是结果集。
第一个查询获取Lonsdale帐户的结果集,获取Robson帐户的另一个结果集,返回结果集,其中第一个结果集中有记录,而第二个中没有记录。< / p>
第二个查询获得单个结果集,但比较是在单行上进行,而不是在单独的结果集上进行。这意味着它将查找分支名称为Lonsdale且分支名称不等于Robson 的所有行。对于同样的记录。 Lonsdale的分支名称基本上取消了与Robson不相等的内容。
这会回答你的问题吗?
答案 1 :(得分:0)
如果您想回答这个问题,您需要由客户进行某种聚合。请考虑以下查询:
SELECT
o.customerID
FROM owns o
INNER JOIN Account a
ON o.accNumber = a.accNumber
GROUP BY
o.customerID
HAVING
SUM(CASE WHEN a.branchName = 'Lonsdale' THEN 1 ELSE 0 END) > 0 AND
SUM(CASE WHEN a.branchName = 'Robson' THEN 1 ELSE 0 END) = 0;
此查询的工作原理是为每位客户统计Lonsdale或Robson中的帐户显示的次数。然后HAVING
子句断言Lonsdale至少出现一次而Robson出现零次。
你的第二种方法不起作用的原因是我们无法计算和不计算单个记录。