加入select语句并删除重复项

时间:2013-12-31 00:39:32

标签: sql-server-2008 join distinct

我正在使用SQL数据库,其中JobUID,jobcode和UID都应具有唯一值。我有一个错误的客户端正在创建重复的条目,其中JobUID和作业代码是重复的,但UID仍然是唯一的。

我正在针对所有视图运行相同的查询,以便识别重复项。这是一个单独的问题,为什么有重复,但我想加入这些查询,所以我得到一个表为我的输出,没有重复。

SELECT r.JobUID, r.jobcode, r.UID, count(1) 
from [dbo].FieldsView r 
group by r.JobUID, r.jobcode, r.UID 
having count(1) > 1 
order by 2, 3

SELECT r.JobUID, r.jobcode, r.UID, count(1)  
from [dbo].HistoryItemsView r  
group by r.JobUID, r.jobcode, r.UID  
having count(1) > 1  
order by 2, 3

当我将查询更改为此时,我只会得到一份受影响的工作代码列表,这就是我想要的:

SELECT Distinct r.jobcode, count(1)  
from [dbo].HistoryItemsView r  
group by r.JobUID, r.jobcode, r.UID  
having count(1) > 1

SELECT Distinct r.jobcode, count(1)  
from [dbo].FieldsView r  
group by r.JobUID, r.jobcode, r.UID  
having count(1) > 1

但是现在我想加入这些,再次删除重复项,因为每个表中都存在相同的作业代码,所以我只得到1个表作为输出,没有重复。

由于

我最终使用的是:

SELECT jobcode, SUM(Amount)
From (

SELECT r.JobUID, r.jobcode, r.UID, count(1) AS Amount 
from [dbo].FieldsView r 
group by r.JobUID, r.jobcode, r.UID having count(1) > 1 

UNION ALL

SELECT r.JobUID, r.jobcode, r.UID, count(1) AS Amount 
from [dbo].HistoryItemsView r 
group by r.JobUID, r.jobcode, r.UID having count(1) > 1 

) X
GROUP BY jobcode
Having SUM(Amount) > 1

再次感谢!

2 个答案:

答案 0 :(得分:0)

您可以使用UNION获取非重复列表。然后,您必须将其视为内部查询以获得正确的计数。

SELECT jobcode, COUNT(*)
FROM
(
    SELECT Distinct r.jobcode  
    from [dbo].HistoryItemsView r  
    group by r.JobUID, r.jobcode, r.UID  
    having count(*) > 1

    UNION

    SELECT Distinct r.jobcode  
    from [dbo].FieldsView r  
    group by r.JobUID, r.jobcode, r.UID  
    having count(*) > 1
) X
GROUP BY jobcode

答案 1 :(得分:0)

IMO你对细节有点不清楚。 如果JobUID和jobcode的组合在所有视图上都应该是唯一的,那么以下语句应该这样做:

SELECT JobUID, Jobcode, SUM(Amount)
FROM
(
    SELECT JobUID, Jobcode, COUNT(*) AS Amount
    from [dbo].HistoryItemsView r  
    group by r.JobUID, r.jobcode

    UNION ALL

    SELECT JobUID, Jobcode, COUNT(*)
    from [dbo].FieldsView r          
    group by r.JobUID, r.jobcode
) X
GROUP BY jobcode
HAVING SUM(Amount) > 1