sql - 使用 join 进行高级 sql 查询

标签 sql database

概念银行示例

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,其中:

  1. 您将获得布鲁克林所有分支机构的branch-name:(selectbranch-name frombranch wherebranch-city = 'Brooklyn')
  2. 您将获取该特定客户在布鲁克林拥有账户的所有branch-name:(从存款人中选择 R.branch-name 作为 T,账户为R 其中 T.帐号 = R.帐号且 S.客户名称 = T.客户名称)
  3. 您正在从 1 中排除(减去)2 中的值。例如,如果“最佳分支”在 2 中,则它将从 1 的结果中删除(如果它是也在那里)。
  4. 您期望 3 的结果为 NOT EXISTS。也就是说,您期望步骤 3 中的减法不会留下任何内容。来自 1 的所有分支也应该已经已在 2 中打印出客户的姓名。

示例

假设布鲁克林有三个分支机构:“最佳”、“平均”和“最差”。

鲍勃转到“最佳”和“平均”。

  1. 所有分支:“最佳”、“平均”、“最差”
  2. Bob 前往的分支:“最佳”、“平均”
  3. 2 - 1:“最佳”、“平均”、“最差”减去“最佳”、“平均”。这让我们只剩下“最差”
  4. 不存在 - 稍等一下,我们还有“最差”!有东西存在!这意味着此条件的计算结果为 false

鲍勃未被选中。


玛丽仅获得“最佳”。

  1. 所有分支:“最佳”、“平均”、“最差”
  2. Bob 去的分支机构:“最佳”
  3. 2 - 1:“最佳”、“平均”、“最差”减去“最佳”。这给我们留下了“平均”、“最差”
  4. 不存在 - 等一下,我们还有“平均”和“最差”!有东西存在!这意味着此条件的计算结果为 false

玛丽没有被选中。


忙碌的人会进入“最佳”、“一般”和“最差”。

  1. 所有分支:“最佳”、“平均”、“最差”
  2. Bob 前往的分支:“最佳”、“平均”、“最差”
  3. 2 - 1:“最佳”、“平均”、“最差”减去“最佳”、“平均”、“最差”。这让我们……一无所有
  4. 不存在 - 没错!我的意思是..那是真的!什么都不存在

忙碌的人已被选择。

关于sql - 使用 join 进行高级 sql 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30713621/

相关文章:

sql - 在Grails中记录特定文件的SQL查询

mysql - Mysql中让字段值设置排序顺序方向

sql - 修改交叉连接查询

MySQL 是否有外键?

java - 是否有适当的方法来管理从文件中删除数据?

php - 我有查询检索 WordPress 中的所有帖子,但如何检查帖子 meta_key =“develop” 和 meta_value ='anything' 的条件

C# 拆分,返回数组中的键/值对

mysql - 连接到 Wampserver 数据库

database - 如何执行存储在数据库中的代码?

sql - SSMS 2008 插件 - 执行查询