概念银行示例
branch (branch_name, branch_city, assets)
customer (customer_name, customer_street, customer_city)
account (account_number, branch_name, balance)
loan (loan_number, branch_name, amount)
depositor (customer_name, account_number)
borrower(customer_name, loan_number)
查找在布鲁克林所有分支机构拥有帐户的所有客户。
select distinct S.customer-name
from depositor as S
where not exists (
(select branch-name
from branch where branch-city = ‘Brooklyn’)
except
(select R.branch-name
from depositor as T, account as R
where T.account-number = R.account-number
and S.customer-name = T.customer-name)
)
我发现以下查询很难理解。有人可以解释一下其背后的逻辑吗?
最佳答案
因此,您要从 depositor
表中选择 customer-name
,其中:
- 您将获得布鲁克林所有分支机构的
branch-name
:(selectbranch-name frombranch wherebranch-city = 'Brooklyn')
- 您将获取该特定客户在布鲁克林拥有账户的所有
branch-name
:(从存款人中选择 R.branch-name 作为 T,账户为R 其中 T.帐号 = R.帐号且 S.客户名称 = T.客户名称)
- 您正在从 1 中
排除
(减去)2 中的值。例如,如果“最佳分支”在 2 中,则它将从 1 的结果中删除(如果它是也在那里)。 - 您期望 3 的结果为
NOT EXISTS
。也就是说,您期望步骤 3 中的减法不会留下任何内容。来自 1 的所有分支也应该已经已在 2 中打印出客户的姓名。
示例
假设布鲁克林有三个分支机构:“最佳”、“平均”和“最差”。
鲍勃转到“最佳”和“平均”。
- 所有分支:“最佳”、“平均”、“最差”
- Bob 前往的分支:“最佳”、“平均”
- 2 - 1:“最佳”、“平均”、“最差”减去“最佳”、“平均”。这让我们只剩下“最差”
不存在
- 稍等一下,我们还有“最差”!有东西存在!这意味着此条件的计算结果为false
鲍勃未被选中。
玛丽仅获得“最佳”。
- 所有分支:“最佳”、“平均”、“最差”
- Bob 去的分支机构:“最佳”
- 2 - 1:“最佳”、“平均”、“最差”减去“最佳”。这给我们留下了“平均”、“最差”
不存在
- 等一下,我们还有“平均”和“最差”!有东西存在!这意味着此条件的计算结果为false
玛丽没有被选中。
忙碌的人会进入“最佳”、“一般”和“最差”。
- 所有分支:“最佳”、“平均”、“最差”
- Bob 前往的分支:“最佳”、“平均”、“最差”
- 2 - 1:“最佳”、“平均”、“最差”减去“最佳”、“平均”、“最差”。这让我们……一无所有
不存在
- 没错!我的意思是..那是真的
!什么都不存在
忙碌的人已被选择。
关于sql - 使用 join 进行高级 sql 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30713621/