从SQL联盟中删除重复项


70

我正在使用联合(对或错)在一些表上做一些基本的sql

但我需要删除重复项。有任何想法吗?

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

1
您是说您的查询不会删除重复项吗?
亚达

Answers:


178

Union将删除重复项。Union All才不是。


3
至少对于MS SQL,这是正确的。
TarasB 2010年

3
有趣的是...不会删除上述声明的重复内容
枪手2010年

2
@thegunner-您是否碰巧将Timestamp数据类型作为列之一?
兰迪·明德

4
@thegunner-Union实际上删除了重复项。我将从两个查询中删除selct *,并一次向两个查询中手动添加一列,直到发现您认为重复的情况为止。找到一个时,数据类型是什么?
兰迪·明德

3
实际上-第二眼看,我没有添加一些列;期望使行变得唯一。我会再看一下查询-谢谢。
枪手2010年


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

请注意,Join中的OR会导致表格扫描,而不是理想的解决方案
Salar

2

如果您使用的是T-SQL,则UNION会从以前的帖子中删除重复项。但是,如果不是,则可以使用与众不同。这对我来说也不太合适,但可以为您提供所需的结果

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

这对我的情况不起作用。我仍然有2列具有相同的数据
lone_coder

2

由于您仍然会重复使用,因此UNION我将检查以下内容:

  • 他们是确切的重复。我的意思是,如果您

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

    您得到的文件较少吗?

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


2
至少T-SQL删除所有重复项,即使它们来自同一数据集也是如此。
卡洛斯

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.