请看看以下结构。
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
答案 0 :(得分:2)
在概念上很简单的一种方法是在两列上JOIN
表A
和B
,然后SELECT
只在{{1}中的那些行在A
:
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);
但请注意,如果col1b
或col2b
包含NULL
值,则会失败。
答案 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)
);