限制,选择UNION重复检查列

时间:2012-01-24 22:34:15

标签: mysql sql sql-server postgresql union

我有两张如下表:

参数1

+------+-----+
| cod  | des |
+------+-----+
|  1   | aaa |
|  2   | bbb |
|  3   | ccc |

parameters2

+------+-----+
| cod  | des |
+------+-----+
|  1   | mmm |

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

SELECT  cod,  des 
FROM parameters1
UNION 
SELECT  cod,  des 
FROM parameters2

我得到了这个结果集:

+------+-----+
| cod  | des |
+------+-----+
|  1   | aaa |
|  2   | bbb |
|  3   | ccc |
|  1   | mmm |

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

+------+-----+
| cod  | des |
+------+-----+
|  1   | aaa |
|  2   | bbb |
|  3   | ccc |

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

+------+-----+
| cod  | des |
+------+-----+
|  1   | mmm |   ---> FROM parameters2
|  2   | bbb |
|  3   | ccc |

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

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

3 个答案:

答案 0 :(得分: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
)

答案 1 :(得分:2)

this link中的解决方案应该适应这些环境,因为它是标准SQL(如果ISNULL不可用,您可以使用COALESCE)。我不确定FULL OUTER JOIN的可用性是什么,但它也应该在所有三个平台上都可用。

在您的情况下,解决方案将最终看起来像:

SELECT  p1.cod,  ISNULL(p1.des, p2.des) AS des
FROM parameters1 p1
    FULL OUTER JOIN parameters2 p2 ON p1.cod = p2.cod

...但是...... MySQL显然不支持FULL OUTER JOIN,因此在这种情况下你可以使用另一种技巧:

SELECT  p1.cod,  ISNULL(p1.des, p2.des) AS des
FROM parameters1 p1
    LEFT JOIN parameters2 p2 ON p1.cod = p2.cod
UNION ALL
SELECT  p2.cod, p2.des
FROM parameters2 p2
    LEFT JOIN parameters1 p1 ON p1.cod = p2.cod
WHERE p1.cod IS NULL

答案 2 :(得分:0)

更改第二个联合查询以仅获取参数2,其中parameters2.id不在parameters1中。