Sql 查找在位于布鲁克林的所有分支机构拥有帐户的所有客户
我有一些桌子: “分行”表(分行名称、分行城市、资产) “客户”表(客户名称、客户街道、客户城市) “账户”表(账户编号、分行名称、余额) “贷款”表(贷款编号、分行名称、金额) “存款人”表(客户名称、账号) “借款人”表(客户名称、贷款编号) 现在,我想找到在布鲁克林的所有分行都有账户的所有客户。这是我针对这个问题的SQL。但是我想知道如何使用表连接,而不使用EXCEPT来解决这个问题。有人能帮我吗?????谢谢Sql 查找在位于布鲁克林的所有分支机构拥有帐户的所有客户,sql,database,Sql,Database,我有一些桌子: “分行”表(分行名称、分行城市、资产) “客户”表(客户名称、客户街道、客户城市) “账户”表(账户编号、分行名称、余额) “贷款”表(贷款编号、分行名称、金额) “存款人”表(客户名称、账号) “借款人”表(客户名称、贷款编号) 现在,我想找到在布鲁克林的所有分行都有账户的所有客户。这是我针对这个问题的SQL。但是我想知道如何使用表连接,而不使用EXCEPT来解决这个问题。有人能帮我吗?????谢谢 SELECT distinct S.customer_name FROM de
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能否澄清这一点是很有趣的。我想不会。对不起,我是说加入。这是我的错误,我改正了。我认为你的第二个解决方案就是我所要求的,并且有一个明确的解释。谢谢,我是说加入。这是我的错误,我改正了。我认为你的第二个解决方案就是我所要求的,并且有一个明确的解释。谢谢