从sql union中删除重复项

时间:2010-11-08 20:23:23

标签: sql tsql

我正在使用一个工会(正确或错误)在我的几张桌子上做一些基本的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

6 个答案:

答案 0 :(得分:144)

Union将删除重复项。 Union All没有。

答案 1 :(得分:5)

除非您指定UNION,否则使用UNION ALL会自动删除重复的行:   http://msdn.microsoft.com/en-us/library/ms180026(SQL.90).aspx

答案 2 :(得分: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

答案 3 :(得分: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

答案 4 :(得分:1)

由于您仍然只使用UNION获得重复,我会检查:

  • 他们是完全相同的。我的意思是,如果你做了一个

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

    你收到的文件较少?

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

答案 5 :(得分:0)

如果使用的是T-SQL,则可以在存储过程中使用临时表,并相应地更新或插入查询记录。