下面的查询是同一个表上2个不同连接的联合,我想对一个否定的SQL查询进行右处理,以确定不满足下面查询的行(两个条件)
SELECT A.col1, A.col2, A.col3, A.col4, A.col5
FROM TAB1 A
LEFT OUTER JOIN TAB2 B
ON A.col6 = B.col7
WHERE A.col6 IS NOT NULL
UNION
SELECT A.col1, A.col2, A.col3, A.col4, A.col5
FROM TAB1 A
LEFT OUTER JOIN TAB2 B
ON A.col1 = B.col1
WHERE A.col6 IS NULL;
字符串
上面的查询是SRC sql的一部分,它在上面的2个数据集上进行联合,然后在上面的sql中按列进行等级划分,我添加了一个staging层来识别坏数据,因此试图让sql识别来自TAB1的数据,这些数据在Tab2中没有对应的数据
2条答案
按热度按时间dm7nw8vv1#
试图让sql识别TAB 1中的数据,这些数据在Tab 2中没有对应的数据
对我来说,这看起来像是
minus
集合运算符的候选者。例如(基于Scott的示例模式,因为它包含一些数据;你没有发布任何所以-这是更容易说明它的方式):
字符串
dept
表中存在但emp
表中不存在的部门:型
你的查询包含了一堆虚拟的列和表名,所以我真的不能建议应该如何查询-这将返回你正在寻找的数据-看起来像。如果您发布了一些示例数据和期望的结果,那将是一个不同的故事。
wljmcqd82#
查询关心tab1的不同行。第一个查询查找col6不为null的行,第二个查询查找col6为null的行。因此,乍一看,两个查询上的
UNION [DISTINCT]
没有太大意义,因为不应该删除任何重复项。但是在这两个查询中,都是外部连接表tab2。由于您只从表tab1中选择列,因此这样做的结果是您得到了所有tab1行,可能还有许多重复行。通过使用
UNION
而不是UNION ALL
,可以再次删除这些重复项。因此,实际上并不是要删除由联合两个查询引起的重复,这正是UNION [DISTINCT]
的目的,而是要使两个数据集不同。因此,您的查询可以缩短为:
字符串
因为对于所有行,col6要么为空,要么不为空。
现在你说你想要相反的,所有不满足条件的行。但是没有条件。选择所有行的相反将是没有行,例如
型
在请求的最后你说
因此,尝试让sql识别来自TAB1的数据,这些数据在Tab2中没有对应的数据
你可能只是在寻找这个:
型
当你想检查数据是否存在于另一个表中时,不要连接,而是使用
[NOT] EXISTS
或[NOT] IN
。