选择UNION作为DISTINCT

时间:2012-01-09 00:37:40

标签: mysql union distinct

如何在执行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

这似乎不起作用。

4 个答案:

答案 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)
  );
相关问题