SQL:查找在Lonsdale拥有帐户但在Robson中没有帐户的客户

时间:2017-10-12 05:20:12

标签: sql

我需要找到拥有帐户的客户的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分支的帐户。我的问题是:为什么这个查询不起作用? (无论运行时间)。这个查询实际上发生了什么?

2 个答案:

答案 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出现零次。

你的第二种方法不起作用的原因是我们无法计算和不计算单个记录。