如何在执行UNION后对单个列执行DISTINCT操作?
T1
--
ID Value
1 1
2 2
3 3
T2
--
ID Value
1 2
4 4
5 5
我想回到桌子上:
ID Value
1 1
2 2
3 3
4 4
5 5
我试过了:
SELECT DISTINCT ID, Value
FROM (SELECT*FROM T1 UNION SELECT*FROM T2) AS T3
这似乎不起作用。
答案 0 :(得分:30)
为什么使用子查询?这将有效:
SELECT * FROM T1
UNION
SELECT * FROM T2
UNION
删除重复项。 (UNION ALL
没有)
答案 1 :(得分:15)
据我所知,没有“单列distinct
”:distinct
始终应用于整个记录(除非在像count(distinct name)
这样的聚合中使用)。原因是,SQL无法猜测Value
为您留下哪些值以及丢弃哪些值。这是你需要自己定义的东西。
尝试使用GROUP BY
确保不会重复ID
,并选择MIN
的任何汇总(此处为Value
,如您的示例中为幸存的最小值),以选择{的特定值{1}}:
SELECT ID, min(Value) FROM (SELECT * FROM T1 UNION ALL SELECT * FROM T2) AS T3
GROUP BY ID
应该正是您所需要的。也就是说,它不是同一个查询,并且没有distinct
- 但它是一个返回示例中显示的查询。
答案 2 :(得分:3)
这个 - 即使这个线程很老 - 可能是OP问题的有效解决方案,即使它可能被认为是脏的。
我们从第一个表中选择所有元组, 然后将它与第二个表中的元组添加(联合),仅限于那些没有在第一个表中匹配的特定字段的元组。
SELECT *
FROM T1
UNION
SELECT *
FROM T2
WHERE (
Value NOT IN (SELECT Value FROM T1)
);
答案 3 :(得分:3)
我认为这就是你的意思:
SELECT *
FROM T1
UNION
SELECT *
FROM T2
WHERE (
**ID
** NOT IN (SELECT ID FROM T1)
);