获取不匹配/已拒绝的行

时间:2015-10-30 06:07:06

标签: sql oracle

如何在具有多个过滤条件的多连接中从最左边的表中获取不匹配/拒绝的行

以下是一个示例查询:

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中获取与上述连接不匹配/拒绝的行。

1 个答案:

答案 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),但可选地可能不存在于右表中。与此对比

  1. INNER JOIN,其中匹配数据必须存在于两个表中,以便将结果包含在结果集中,
  2. 一个正确的外部联接,其中数据必须存在于最右边的表中,但可选地可能不存在于左表中,并且
  3. 一个FULL OUTER JOIN,其中数据必须存在于两个表中的一个表中,但在另一个表中可能没有匹配的数据。 (完全外连接可以同时被视为左外连接和右外连接。)
  4. 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行结束 - 可能不是预期的。为了让事情合理,我添加了一个连接条件。