Oracle SQL负向查询编写:识别TAB1无TAB2匹配的异常数据
坏数据识别SQL实现
先拆解原查询的筛选逻辑:原查询从TAB1中选取满足以下任一条件的行:
- 当
A.col6不为空时,能通过A.col6 = B.col7关联到TAB2的记录; - 当
A.col6为空时,能通过A.col1 = B.col1关联到TAB2的记录。
要识别TAB1中不满足上述任一条件的坏数据,也就是:
A.col6不为空,但无法通过A.col6 = B.col7关联到TAB2的任何记录;- 或者
A.col6为空,但无法通过A.col1 = B.col1关联到TAB2的任何记录。
对应的负向查询SQL如下:
SELECT A.col1, A.col2, A.col3, A.col4, A.col5, A.col6 FROM TAB1 A LEFT OUTER JOIN TAB2 B ON (A.col6 IS NOT NULL AND A.col6 = B.col7) OR (A.col6 IS NULL AND A.col1 = B.col1) WHERE B.col1 IS NULL; -- 若TAB2有主键或非空约束列,替换为该列判断未关联更准确
逻辑说明
- 关联条件合并:把原查询的两个分支关联逻辑整合到
LEFT JOIN的ON子句中,一次性覆盖两种关联场景; - 未关联判断:通过
WHERE B.col1 IS NULL筛选出TAB1中无法匹配TAB2任何记录的行,这些就是需要识别的坏数据(如果TAB2有更合适的非空标识列,比如主键,替换成该列能提升判断准确性)。
内容的提问来源于stack exchange,提问作者Tanmaya
相关产品推荐
相关产品推荐

