从SQL Union中删除重复项

92

我在对几个表进行基本的 SQL 操作,使用了 UNION(正确或错误)

但是我需要去除重复项。有什么建议吗?

select * from calls
left join users a on calls.assigned_to= a.user_id
where a.dept = 4 
union
select * from calls
left join users r on calls.requestor_id= r.user_id
where r.dept = 4

3
你的意思是你的查询结果没有去重吗? - Yada
6个回答

219

Union 会移除重复项。Union All 不会。


4
这是真的,至少对于 MS SQL 是这样。 - TarasB
3
有趣的是...上述陈述中的重复内容并未被移除。 - thegunner
2
@thegunner - 你的列中是否有时间戳数据类型? - Randy Minder
4
联合查询确实会去除重复记录。我建议您将两个查询中的“select *”删除,并手动逐一添加列,直到发现重复记录的情况为止。当您发现重复记录时,请问数据类型是什么? - Randy Minder
3
实际上,在第二次查看时,我发现添加了一些列,这是我没有预料到的,导致行变得不唯一。我会再次查看查询 - 谢谢。 - thegunner
显示剩余4条评论

6

4
这是否包括由“联合”查询之一返回的重复行? - Zach Smith
@ZachSmith 是的,看起来确实是这样,我刚刚遇到了一个相关的错误(使用Postgres数据库),当我注释掉我的第二个“unioned”子查询时,结果出现了更多的行,这让我感到非常奇怪。 - cjauvin

4

其他人已经回答了你的直接问题,但是也许你可以简化查询以消除问题(或者我错过了什么,像以下查询一样会产生实质性不同的结果吗?):

select * 
    from calls c join users u
        on c.assigned_to = u.user_id 
        or c.requestor_id = u.user_id
    where u.dept = 4

请注意,在连接操作中使用OR会导致表扫描,这不是一个理想的解决方案。 - Salar

4

由于您仍然只使用UNION而产生重复,我建议您检查以下几点:

  • 它们是否完全相同。我的意思是,如果您执行

    SELECT DISTINCT * FROM (<your query>) AS subquery

    您会得到更少的文件吗?

  • 您是否已经在查询的第一部分中有了重复项(可能是由左连接生成的)。据我所知,UNION不会向结果集添加已经存在的行,但它不会删除已经存在于第一个数据集中的重复项。


2
至少T-SQL会删除所有重复项,即使它们来自同一数据集。 - Carlos
我一直在苦思冥想,然后我读了你的解决方案并检查了一下...发现第1列不同...因此出现了“重复”行... - Xonshiz

2
如果您使用的是T-SQL,那么从之前的帖子中可以看出UNION会去重。但如果您不使用T-SQL,则可以使用DISTINCT。这对我来说也不完全正确,但它可以让您获得您要查找的结果。
SELECT DISTINCT *
FROM
(
select * from calls
left join users a on calls.assigned_to= a.user_id
where a.dept = 4 
union
select * from calls
left join users r on calls.requestor_id= r.user_id
where r.dept = 4
)a

这在我的情况下不起作用。我仍然有两列具有相同数据。 - greendino

0
如果您正在使用 T-SQL,您可以在存储过程中使用临时表,根据需要更新或插入查询记录。

如果您想指向某些东西,可以使用注释。 - Abdulrahman Falyoun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接