ORACLE不在多列上

时间:2015-05-21 05:57:43

标签: sql oracle

请看看以下结构。

Table: A
+---------+----------+
| Col1A   | Col2A    |
+---------+----------+
|   1     |    1     |
|   2     |    1     |
|   3     |    1     |
|   4     |    1     |
|   1     |    2     |
|   2     |    2     |
+---------+----------+

Table: B
+---------+----------+
| Col1B   | Col2B    |
+---------+----------+
|   2     |    1     |
|   3     |    1     |
+---------+----------+

以下是我要实现的目标,即获得如下结果:

Result 
+---------+----------+
| Col1A   | Col2A    |
+---------+----------+
|   1     |    1     |
|   4     |    1     |
|   1     |    2     |
|   2     |    2     |
+---------+----------+

我想要的是什么:

我想获得表A中不存在的表B记录的结果。它应该在两个列的基础上。如果组合存在于第一个表中,则不要显示它。

到目前为止我尝试了什么:

我尝试过的第一种方法是使用Not In语句。以下是我的发言。

SELECT A.COL1A, A.COL2A 
FROM A
WHERE A.COL1A NOT IN (
   SELECT B.COL1B FROM B
);

但这种方法的问题并未考虑第二栏。它会给我以下结果。

+---------+----------+
|   1     |    1     |
|   4     |    1     |
+---------+----------+

虽然因为我们没有检查其他列,所以它不会显示,因为它应该被子跟踪。

+---------+----------+
|   1     |    2     |
|   2     |    2     |
+---------+----------+

然后我尝试Not Exists,但我也没有工作。这是我的询问。

SELECT A.COL1A, A.COL2A 
FROM A
WHERE NOT EXISTS(
   SELECT B.COL1B,B.COL2B FROM B
 );

修改 对不起,我忘了包括小提琴链接 这是: Fiddle Demo

4 个答案:

答案 0 :(得分:2)

在概念上很简单的一种方法是在两列上JOINAB,然后SELECT只在{{1}中的那些行在A

中存在 not
B

答案 1 :(得分:2)

对于使用存在,我认为你应该像这样使用它:

SELECT *
FROM A
WHERE
    NOT EXISTS(SELECT 1
               FROM B
               WHERE A.Col1A = B.Col1B AND A.Col2A = B.Col2B)

答案 2 :(得分:2)

SELECT *
FROM a
WHERE (col1a, col2a) NOT IN (SELECT col1b, col2b FROM b);

但请注意,如果col1bcol2b包含NULL值,则会失败。

SQLFiddle DEMO

答案 3 :(得分:0)

SELECT A.COL1A, A.COL2A 
FROM A
WHERE (Col1A, Col2A) NOT IN (
   SELECT Col1B, Col2B FROM B
);

您甚至可以使用:

SELECT A.COL1A, A.COL2A 
FROM A
WHERE (Col1A, Col2A) NOT IN (
   (2, 1),
   (3, 1)
);