2012-01-09 93 views
11

如何在执行UNION后对单个列执行DISTINCT操作?SELECT UNION as 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 

这似乎并没有工作。

+1

- 以什么方式? – 2012-01-09 00:39:26

+0

你没有给我们所有的细节,它的值总是必须与场1,最小值,最大值,随机值相同......任何方式都不同于所有场,而不仅仅是一场。 – 2012-01-09 00:50:41

+2

看到我的答案比你选择的更好的答案 – Bohemian 2012-01-09 01:13:50

回答

15

至于我可以说,没有“一栏distinct”:distinct总是应用于整个记录(除非像count(distinct name)的集合中使用)。原因是,SQL无法猜测哪个值为Value要离开你,以及哪个值会丢失。这是你需要自己定义的东西。

尝试使用GROUP BY确保ID是不能重复的,和任何集合(这里MIN,因为在你的例子是幸存的最小)选择的Value特定值:

SELECT ID, min(Value) FROM (SELECT * FROM T1 UNION ALL SELECT * FROM T2) AS T3 
GROUP BY ID 

应该是完全你需要什么。也就是说,它不是相同的查询,并且没有distinct-但它是一个查询,它将返回示例中显示的内容。

+0

你确定这是相同的查询? – 2012-01-09 00:42:43

+0

我建议在子查询中使用'UNION ALL',因为在执行两次'DISTINCT'时没有意义。 – 2012-01-09 00:44:11

+0

@MitchWheat我确定它不是 - 但它是一个查询,它将返回示例中显示的内容。 – alf 2012-01-09 00:44:39

25

你为什么使用子查询?这将工作:

SELECT * FROM T1 
UNION 
SELECT * FROM T2 

UNION删除重复项。 (UNION ALL没有)

+0

Point是,OP想要一种叫做“单场DISTINCT”的东西,而且没有这样的概念。 – alf 2012-01-09 10:16:14

+1

这必须是被接受的答案。 – 2016-11-23 08:27:28

+0

如果您的UNION记录[1,1]和[1,2],您将在结果集中得到两者。 OP不希望第一列重复。显然这个答案对很多人都有帮助,但我不认为它回答了问题。 – user7733611 2017-11-09 16:58:46

2

即使这个线程已经过时 - 可能是OP问题的工作解决方案,即使它可能被认为是脏的。

我们从第一个表中的所有元组, 然后加入(工会),它与第二个表仅限于那些母鹿没有在第一个表匹配的特定领域的元组。

SELECT * 
    FROM T1 
UNION 
SELECT * 
    FROM T2 
    WHERE (
    Value NOT IN (SELECT Value FROM T1) 
); 
3

我想这就是你的意思:“这似乎不工作”

SELECT * 
    FROM T1 
UNION 
SELECT * 
    FROM T2 
    WHERE (
    **ID 
** NOT IN (SELECT ID FROM T1) 
); 
+0

我真的认为这应该是问题的接受答案。它可以让您优先选择哪个表获取从中选择的值,而不是使用GROUP BY执行MIN()。取决于OP如何选择价值。 – user7733611 2017-11-09 17:05:10