限制,选择UNION重复检查列

ale*_*oot 6 mysql sql sql-server postgresql union

我有两个表,如下所示:

参数1

+------+-----+
| cod  | des |
+------+-----+
|  1   | aaa |
|  2   | bbb |
|  3   | ccc |
Run Code Online (Sandbox Code Playgroud)

parameters2

+------+-----+
| cod  | des |
+------+-----+
|  1   | mmm |
Run Code Online (Sandbox Code Playgroud)

我通常以这种方式用UNION加入这两个表的结果集:

SELECT  cod,  des 
FROM parameters1
UNION 
SELECT  cod,  des 
FROM parameters2
Run Code Online (Sandbox Code Playgroud)

我得到这个结果集:

+------+-----+
| cod  | des |
+------+-----+
|  1   | aaa |
|  2   | bbb |
|  3   | ccc |
|  1   | mmm |
Run Code Online (Sandbox Code Playgroud)

我想限制UNION重复检查只到cod列,所以我想避免1鳕鱼在结果集中重复(当有一个具有不同名称和相同鳕鱼的记录),我想从中获取名称第一个表(parameters1):

+------+-----+
| cod  | des |
+------+-----+
|  1   | aaa |
|  2   | bbb |
|  3   | ccc |
Run Code Online (Sandbox Code Playgroud)

更新 如果我1parameters1 table(DELETE FROM parameters1 WHERE cod = 1)中删除记录,我应该得到这个结果集:

+------+-----+
| cod  | des |
+------+-----+
|  1   | mmm |   ---> FROM parameters2
|  2   | bbb |
|  3   | ccc |
Run Code Online (Sandbox Code Playgroud)

是否可以将UNION的重复检查限制为仅一个字段或某些字段?怎么样 ?

该解决方案应该适用于多数据库环境(MSSQL,PostgreSQL,MySQL).

Mic*_*son 9

SELECT  cod, des 
FROM parameters1 p1
UNION ALL
SELECT  cod, des 
FROM parameters2 p2
WHERE NOT EXISTS (
    SELECT 1
    FROM parameters1 p1sub
    WHERE p1sub.cod = p2.cod
)
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的,但使用`UNION ALL`应该更快. (2认同)