# SQL,#oracle#testing

gstyhher  于 2023-08-03  发布在  Oracle
关注(0)|答案(2)|浏览(111)

下面的查询是同一个表上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中没有对应的数据

dm7nw8vv

dm7nw8vv1#

试图让sql识别TAB 1中的数据,这些数据在Tab 2中没有对应的数据
对我来说,这看起来像是minus集合运算符的候选者。
例如(基于Scott的示例模式,因为它包含一些数据;你没有发布任何所以-这是更容易说明它的方式):

SQL> select * from dept;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON

SQL> select deptno, count(*) from emp group by deptno order by deptno;

    DEPTNO   COUNT(*)
---------- ----------
        10          3
        20          5
        30          6

字符串
dept表中存在但emp表中不存在的部门:

SQL> select deptno from dept
  2  minus
  3  select deptno from emp;

    DEPTNO
----------
        40

SQL>


你的查询包含了一堆虚拟的列和表名,所以我真的不能建议应该如何查询-这将返回你正在寻找的数据-看起来像。如果您发布了一些示例数据和期望的结果,那将是一个不同的故事。

wljmcqd8

wljmcqd82#

查询关心tab1的不同行。第一个查询查找col6不为null的行,第二个查询查找col6为null的行。因此,乍一看,两个查询上的UNION [DISTINCT]没有太大意义,因为不应该删除任何重复项。
但是在这两个查询中,都是外部连接表tab2。由于您只从表tab1中选择列,因此这样做的结果是您得到了所有tab1行,可能还有许多重复行。通过使用UNION而不是UNION ALL,可以再次删除这些重复项。因此,实际上并不是要删除由联合两个查询引起的重复,这正是UNION [DISTINCT]的目的,而是要使两个数据集不同。
因此,您的查询可以缩短为:

SELECT col1, col2, col3, col4, col5 FROM tab1;

字符串
因为对于所有行,col6要么为空,要么不为空。
现在你说你想要相反的,所有不满足条件的行。但是没有条件。选择所有行的相反将是没有行,例如

SELECT col1, col2, col3, col4, col5 FROM tab1 WHERE ROWNUM = 0;


在请求的最后你说
因此,尝试让sql识别来自TAB1的数据,这些数据在Tab2中没有对应的数据
你可能只是在寻找这个:

SELECT col1, col2, col3, col4, col5
FROM tab1
WHERE (col6 IS NOT NULL AND NOT EXISTS (SELECT null FROM tab2 WHERE tab2.col7 = tab1.col6)
   OR (col6 IS     NULL AND NOT EXISTS (SELECT null FROM tab2 WHERE tab2.col1 = tab1.col1);


当你想检查数据是否存在于另一个表中时,不要连接,而是使用[NOT] EXISTS[NOT] IN

相关问题