防止Oracle减去语句删除重复项

Mar*_*eon 7 sql oracle

鉴于这两个表:

CREATE TABLE TEST1 (TEST  VARCHAR2(1 BYTE))
CREATE TABLE TEST2 (TEST  VARCHAR2(1 BYTE))
Run Code Online (Sandbox Code Playgroud)

其中TEST1有两行,值均为'A',而TEST2有一行,值为'B'.

当我运行此命令时:

SELECT TEST FROM TEST1
MINUS
SELECT TEST FROM TEST2
Run Code Online (Sandbox Code Playgroud)

我得到输出:

Test
-----
A
Run Code Online (Sandbox Code Playgroud)

似乎MINUS删除了重复项(因为TEST1中有两个'A'行).

如何让MINUS查询包含重复值(返回两个'A'行)?

Dav*_*sta 8

另外一个选项:

SELECT TEST, row_number() OVER (PARTITION BY TEST ORDER BY TEST) FROM TEST1
MINUS
SELECT TEST, row_number() OVER (PARTITION BY TEST ORDER BY TEST) FROM TEST2
Run Code Online (Sandbox Code Playgroud)

这将是MINUS,每个副本都被视为一个不同的条目.请注意,在下面的示例中,如果TEST1有两个'C'值且TEST2只有一个,则输出中会得到一个.

dev> select * from test1;

T
-
A
A
B
C
C

dev> select * from test2;

T
-
B
C

dev>     SELECT TEST, row_number() OVER (PARTITION BY TEST ORDER BY TEST) FROM TEST1
  2      MINUS
  3      SELECT TEST, row_number() OVER (PARTITION BY TEST ORDER BY TEST) FROM TEST2
  4  /

T ROW_NUMBER()OVER(PARTITIONBYTESTORDERBYTEST)
- --------------------------------------------
A                                            1
A                                            2
C                                            2
Run Code Online (Sandbox Code Playgroud)


And*_*mar 0

Oracle支持IN语句中的多列,因此可以这样写:

SELECT a, b, c
FROM table1
WHERE (a,b,c) not in (
    select a,b,c from table2
)
Run Code Online (Sandbox Code Playgroud)