如何在具有多个过滤条件的多连接中从最左边的表中获取不匹配/拒绝的行
以下是一个示例查询:
select *
from Tab1 join Tab2 join Tab3
on Tab1.col1=Tab2.col1
and Tab1.col2=Tab2.col3
and Tab1.col4=Tab2.col5
and Tab3.col2=<value>
and Tab1.col3=<value>
and Tab1.col4=<value>
and Tab2.col3=<value>
我想从Tab1中获取与上述连接不匹配/拒绝的行。
答案 0 :(得分:0)
您似乎想要执行类似
的操作select *
from Tab1
LEFT OUTER join Tab2
on Tab1.col1=Tab2.col1 and
Tab1.col2=Tab2.col3 and
Tab1.col4=Tab2.col5 AND
Tab2.col3=<value>
LEFT OUTER join Tab3
ON (TAB3.SOMETHING = TAB1.SOMETHING OR
TAB3.SOMETHING_ELSE = TAB2.SOMETHING_ELSE) AND
Tab3.col2=<value> and
WHERE Tab1.col3=<value> and
Tab1.col4=<value> AND
TAB2.PRIMARY_KEY IS NULL AND
TAB3.PRIMARY_KEY IS NULL;
注意使用外连接。 LEFT OUTER JOIN表示数据必须出现在左表中(例如,TAB1和TAB2之间的连接中的TAB1),但可选地可能不存在于右表中。与此对比
WHERE子句检查TAB2.PRIMARY_KEY和TAB3.PRIMARY_KEY是否为NULL。根据定义,主键必须是非NULL,因此在连接数据中PK列为NULL的事实意味着在连接表中找不到匹配的行。
您的示例查询存在以下问题:将TAB3连接到TAB1或TAB2没有条件。虽然你可以这样做,但这意味着来自TAB1和TAB2的连接的每一行都将连接到TAB3中TAB3.COL2 =的每一行。因此,如果TAB1和TAB2的连接发出1000行,而TAB3包含1000行,那么结果表将以1000 * 1000 = 1,000,000行结束 - 可能不是预期的。为了让事情合理,我添加了一个连接条件。