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

SQL:查找在Lonsdale有帐户但在Robson没有帐户的客户,sql,Sql,我需要找到在中有帐户的客户的客户ID 朗斯代尔分店,但在罗布森没有 银行模式: Customer = {customerID, firstName, lastName, birthDate, income} Account = {accNumber, type, balance, rate, branchName} ▪ branchName is a foreign key referencing Branch Owns = {customerID, accNumber} ▪ c

我需要找到在中有帐户的客户的客户ID 朗斯代尔分店,但在罗布森没有

银行模式:

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
但是,不正确的查询如下:

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
选择O1.customerID
来自O1账户A1、O2账户A2
其中O1.customerID=O2.customerID和
O1.accNumber=A1.accNumber和
O2.accNumber=A2.accNumber和
A1.branchName='Lonsdale'和
A2.branchName'Robson

该查询实际上返回谁拥有任何不是Robson分支的帐户。我的问题是:为什么这个查询不起作用?(无论运行时间如何)。此查询中实际发生了什么?

原因是由于结果集

第一个查询获取Lonsdale帐户的结果集,获取Robson帐户的另一个结果集,返回第一个结果集中有记录而第二个结果集中没有记录的结果集

第二个查询获取单个结果集,但比较是在单个行上进行的,而不是在单独的结果集上进行的。这意味着它将查找分支名称为Lonsdale且分支名称不等于Robson的所有行。同样的记录。Lonsdale的分支名称基本上抵消了不等于Robson的分支名称


这回答了你的问题吗?

如果你想回答这个问题,你需要按客户进行某种汇总。考虑下面的查询:

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


第二种方法不起作用的原因是,我们不能同时计算和不计算一条记录。

如果客户拥有Lonsdale帐户,它将连续两次获得一行ID和Lonsdale。这会自动满足A1.branchName='Lonsdale'和A2.branchName'Robson'我现在明白了