SQL UNION:是否定义了重复消除的顺序?

时间:2014-07-08 09:24:56

标签: sql

虽然这个问题似乎有点显而易见,但我找不到一个明确的规范,说明如何定义UNION DISTINCT的重复消除(我希望它一般定义,而不是按数据库系统定义):

写作时

select * from table A 
    union distinct
select * from table B

和A和B有重复的值(关于关键字段),我可以依赖A的记录优先于B的记录吗?

例如,假设A有一条记录,其中键字段的值为1,数据字段的值为' x'和B也有一个记录,也是键值1,但数据字段值为' y'。 我可以肯定,结果会有价值' x'在数据字段?

3 个答案:

答案 0 :(得分:2)

无法检测消除顺序,因为在执行UNION时会考虑所有列,而不仅仅是关键列:

create table a(k int primary key,x int);
create table b(k int primary key,y int);
insert into a(k,x) values (1,1),(2,2);
insert into b(k,y) values (1,3),(2,2);

select * from a
union distinct
select * from b

以上产生三行,而不是两行(demo):

1 1
2 2
1 3

即使两个表中都存在1的主键,但这些表中的非键列具有不同的值。这会在{1, 1}的结果中保留两行{1, 3}UNION

答案 1 :(得分:1)

是。 Distinct删除完全相同的行。您的结果中将包含(1,x)和(1,y)。

答案 2 :(得分:1)

UNION [DISTINCT]删除重复的结果行。因此,如果从表中选择列(1,x)和(1,y),无论它们出现的频率和表格中的哪一个,您都将获得两行,每行只有一次。

结果与

相同
select distinct *
from (select * from a union all select * from b);

只是更短,可能更快。

BTW:所有dbms中都不允许使用UNION后的关键字DISTINCT。通常你会写UNION。另一方面,对于上述查询,某些dbms需要from (select * from a union all select * from b) dummy;中任何派生表的别名。