首页 > 解决方案 > (A AND B) OR NOT B 内连接的 SQL 逻辑

问题描述

我希望按如下方式进行内部连接:

SELECT a.Account
FROM TableA a
JOIN TableB b 
  ON (a.Account = b.Account AND a.Source IN (SELECT Source FROM TableC))
  OR a.Source NOT IN (SELECT Source FROM TableC)

有没有更简单或更有效的方法来实现这一点?

一些数据示例:

表A(帐户,来源):

Account | Source
------------------
111     | florida
222     | florida
333     | georgia
444     | alabama
555     | new York

表B(帐户):

Account
-------
111
222
333

表C(来源):

Source
-------
florida
alabama

标签: sqlsql-serverinner-join

解决方案


我认为可以通过使用两个左连接和一个WHERE子句来重写查询,以避免重复条件a.Source [NOT] IN (SELECT Source FROM TableC)

SELECT a.Account
FROM TableA a
LEFT JOIN TableB b ON a.Account = b.Account
LEFT JOIN TableC c ON c.Source = a.Source
WHERE 
    (c.Source IS NOT NULL AND b.Account IS NOT NULL)
    OR c.Source IS NULL

这意味着:TableA如果两个连接都成功,或者连接不成功,则选择一条记录TableC


推荐阅读