Sql 查找在位于布鲁克林的所有分支机构拥有帐户的所有客户

Sql 查找在位于布鲁克林的所有分支机构拥有帐户的所有客户,sql,database,Sql,Database,我有一些桌子: “分行”表(分行名称、分行城市、资产) “客户”表(客户名称、客户街道、客户城市) “账户”表(账户编号、分行名称、余额) “贷款”表(贷款编号、分行名称、金额) “存款人”表(客户名称、账号) “借款人”表(客户名称、贷款编号) 现在,我想找到在布鲁克林的所有分行都有账户的所有客户。这是我针对这个问题的SQL。但是我想知道如何使用表连接,而不使用EXCEPT来解决这个问题。有人能帮我吗?????谢谢 SELECT distinct S.customer_name FROM de

我有一些桌子:

“分行”表(分行名称、分行城市、资产)

“客户”表(客户名称、客户街道、客户城市)

“账户”表(账户编号、分行名称、余额)

“贷款”表(贷款编号、分行名称、金额)

“存款人”表(客户名称、账号)

“借款人”表(客户名称、贷款编号)

现在,我想找到在布鲁克林的所有分行都有账户的所有客户。这是我针对这个问题的SQL。但是我想知道如何使用表连接,而不使用EXCEPT来解决这个问题。有人能帮我吗?????谢谢

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 ))

假设您想要一个答案:“查找在布鲁克林任何分行拥有帐户的所有客户”


如果一个客户可以拥有多个帐户,或者一个帐户可以拥有多个分支机构,则您需要调整联接。

假设您想要回答:“查找在布鲁克林任何分支机构拥有帐户的所有客户”


如果一个客户可以有多个帐户,或者一个帐户可以有多个分支机构,则需要调整联接。

我想不出使用
UNION
的方法。你的问题是找到一个在布鲁克林拥有所有分支机构的客户。基本上有两种方法可以做到这一点

解决方案1-查找在布鲁克林没有全部分支机构的客户

(故意双重否定)。换句话说,找到所有在布鲁克林没有至少一家分支机构的客户,然后拿走其余的

这就是您在示例中所做的。您将获得布鲁克林
的所有分支机构,但客户拥有的分支机构除外,如果没有剩余的布鲁克林分支机构,则客户将拥有所有分支机构。您可以使用连接的另一种方式来实现这一点,尽管您的连接可能更具可读性

SELECT customer_name
FROM customer
WHERE customer_name NOT IN (
    SELECT d.customer_name
    FROM depositor d
    INNER JOIN branch brooklyn ON brooklyn.branch_city = 'Brooklyn'
    LEFT JOIN account a 
        ON d.account_number = a.account_number
        AND brooklyn.branch_name = a.branch_name 
    WHERE a.account_number IS NULL )
解决方案2-查找在布鲁克林拥有与布鲁克林相同数量分支机构的所有客户

SELECT d.customer_name
FROM depositor d
INNER JOIN account a ON d.account_number = a.account_number
INNER JOIN branch b ON a.branch_name = b.branch_name
WHERE b.branch_city = 'Brooklyn'
GROUP BY d.customer_name
HAVING COUNT(DISTINCT B.branch_name) = (
    SELECT COUNT(branch_name)
    FROM branch 
    WHERE branch_city = 'Brooklyn')
为了做到这一点,您需要使用
分组依据
来获得每个客户的布鲁克林分行数量,然后您可以使用它与布鲁克林分行总数进行比较

SELECT d.customer_name
FROM depositor d
INNER JOIN account a ON d.account_number = a.account_number
INNER JOIN branch b ON a.branch_name = b.branch_name
WHERE b.branch_city = 'Brooklyn'
GROUP BY d.customer_name
HAVING COUNT(DISTINCT B.branch_name) = (
    SELECT COUNT(branch_name)
    FROM branch 
    WHERE branch_city = 'Brooklyn')
使用
联合
组合两个数据集。如果你的问题是

“查找拥有布鲁克林分行账户或贷款的所有客户。”

…然后您可以使用
联合

SELECT DISTINCT d.customer_name
FROM depositor d
INNER JOIN account a ON d.account_number = a.account_number
INNER JOIN branch b ON a.branch_name = b.branch_name
WHERE b.branch_city = 'Brooklyn'
UNION
SELECT DISTINCT l.customer_name
FROM borrower bo
INNER JOIN loan l ON bo.loan_number = l.loan_number
INNER JOIN branch b ON l.branch_name = b.branch_name
WHERE b.branch_city = 'Brooklyn'

我想不出使用
UNION
实现这一点的方法。你的问题是找到一个在布鲁克林拥有所有分支机构的客户。基本上有两种方法可以做到这一点

解决方案1-查找在布鲁克林没有全部分支机构的客户

(故意双重否定)。换句话说,找到所有在布鲁克林没有至少一家分支机构的客户,然后拿走其余的

这就是您在示例中所做的。您将获得布鲁克林
的所有分支机构,但客户拥有的分支机构除外,如果没有剩余的布鲁克林分支机构,则客户将拥有所有分支机构。您可以使用连接的另一种方式来实现这一点,尽管您的连接可能更具可读性

SELECT customer_name
FROM customer
WHERE customer_name NOT IN (
    SELECT d.customer_name
    FROM depositor d
    INNER JOIN branch brooklyn ON brooklyn.branch_city = 'Brooklyn'
    LEFT JOIN account a 
        ON d.account_number = a.account_number
        AND brooklyn.branch_name = a.branch_name 
    WHERE a.account_number IS NULL )
解决方案2-查找在布鲁克林拥有与布鲁克林相同数量分支机构的所有客户

SELECT d.customer_name
FROM depositor d
INNER JOIN account a ON d.account_number = a.account_number
INNER JOIN branch b ON a.branch_name = b.branch_name
WHERE b.branch_city = 'Brooklyn'
GROUP BY d.customer_name
HAVING COUNT(DISTINCT B.branch_name) = (
    SELECT COUNT(branch_name)
    FROM branch 
    WHERE branch_city = 'Brooklyn')
为了做到这一点,您需要使用
分组依据
来获得每个客户的布鲁克林分行数量,然后您可以使用它与布鲁克林分行总数进行比较

SELECT d.customer_name
FROM depositor d
INNER JOIN account a ON d.account_number = a.account_number
INNER JOIN branch b ON a.branch_name = b.branch_name
WHERE b.branch_city = 'Brooklyn'
GROUP BY d.customer_name
HAVING COUNT(DISTINCT B.branch_name) = (
    SELECT COUNT(branch_name)
    FROM branch 
    WHERE branch_city = 'Brooklyn')
使用
联合
组合两个数据集。如果你的问题是

“查找拥有布鲁克林分行账户或贷款的所有客户。”

…然后您可以使用
联合

SELECT DISTINCT d.customer_name
FROM depositor d
INNER JOIN account a ON d.account_number = a.account_number
INNER JOIN branch b ON a.branch_name = b.branch_name
WHERE b.branch_city = 'Brooklyn'
UNION
SELECT DISTINCT l.customer_name
FROM borrower bo
INNER JOIN loan l ON bo.loan_number = l.loan_number
INNER JOIN branch b ON l.branch_name = b.branch_name
WHERE b.branch_city = 'Brooklyn'

这不是你的另一个问题吗?在任何情况下,我认为您希望使用JOIN而不是UNION。您是在试图理解UNION是如何工作的,还是在试图找到一个好的查询解决方案?这不是像您的另一个问题吗?在任何情况下,我认为您希望使用JOIN而不是UNION。您是在试图了解UNION是如何工作的,还是在试图找到一个好的查询解决方案?我想问题是询问在布鲁克林所有分支机构拥有帐户的客户,此解决方案将返回在布鲁克林任何分支机构拥有帐户的客户。@fqhv,我同意这是一个可能的问题解读。我以为这是在要求什么。看看OP能否澄清这一点是很有趣的。我想不会。我想问题是问在布鲁克林所有分行都有账户的客户,此解决方案将返回在布鲁克林任何分行都有账户的客户。@fqhv,我同意这是一个可能的问题解读。我以为这是在要求什么。看看OP能否澄清这一点是很有趣的。我想不会。对不起,我是说加入。这是我的错误,我改正了。我认为你的第二个解决方案就是我所要求的,并且有一个明确的解释。谢谢,我是说加入。这是我的错误,我改正了。我认为你的第二个解决方案就是我所要求的,并且有一个明确的解释。谢谢