我有两张如下表:
参数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)。
答案 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中。