鉴于这两个表:
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'行)?
另外一个选项:
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)
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)
| 归档时间: |
|
| 查看次数: |
15914 次 |
| 最近记录: |