2013-11-21 28 views
1

我有一個查詢,我想找到行,其中既ActivityDate和任務id有在同一時間多個條目:返回所有行/列,其中多列是非分明

SELECT 
    ActivityDate, taskId 
FROM 
    [DailyTaskHours] 
GROUP BY 
    ActivityDate, taskId 
HAVING 
    COUNT(*) > 1 

上面的查詢似乎工作。不過,我希望所有的列現在只返回兩個(ActivityDate,taskId)。這不起作用:

SELECT * 
FROM 
    [DailyTaskHours] 
GROUP BY 
    ActivityDate, taskId 
HAVING 
    COUNT(*) > 1 

因爲許多列不在group by子句中。我不希望任何列受到除ActivityDate,taskId以外的HAVING COUNT(*)> 1影響。

我該如何做到這一點?

+0

我給出了一個答案。這恰好與您剛剛在20米前刪除的問題完全相同。 – laylarenee

回答

1
SELECT t1.* 
FROM 
    [DailyTaskHours] t1 
INNER JOIN (
    SELECT 
     ActivityDate, taskId 
    FROM 
     [DailyTaskHours] 
    GROUP BY 
     ActivityDate, taskId 
    HAVING 
     COUNT(*) > 1 
) t2 ON (
    t1.ActivityDate = t2.ActivityDate AND 
    t1.taskId = t2.taskId 
) 
0

這裏是SQL Fiddle顯示在行動以下查詢:

SELECT DISTINCT m.* 
FROM 
(
    SELECT s.ActivityDate, s.taskId 
    FROM DailyTaskHours s 
    GROUP BY s.ActivityDate, s.taskId 
    HAVING COUNT(*) > 1 
) sub 
JOIN DailyTaskHours m 
ON m.taskId = sub.taskId 
AND m.ActivityDate = sub.ActivityDate 
+0

您在連接子句中缺少ActivityDate – aweis

2
WITH sel as(
SELECT 
    ActivityDate, taskId 
FROM 
    [DailyTaskHours] 
GROUP BY 
    ActivityDate, taskId 
HAVING 
    COUNT(*) > 1 
) 
SELECT * 
     FROM [DailyTaskHours] d 
      INNER JOIN sel ON d.ActivityDate = sel.ActivityDate AND d.taskId = sel.taskId 
+0

@Linger我不理解請求不同結果的原始查詢。假設'DailyTaskHours'有一個主鍵,最好的做法是,'DISTINCT'不起作用。但是,當然,如果需要,可以很容易地添加「DISTINCT」。 – FrankPl

0
-- fully functional example. 
DECLARE @table TABLE (ActivityDate DATE, TaskID INT); 

SET NOCOUNT ON; 
INSERT @table VALUES ('01/01/2013',1); 
INSERT @table VALUES ('01/02/2013',1); 
INSERT @table VALUES ('01/02/2013',2); 
INSERT @table VALUES ('01/03/2013',1); 
INSERT @table VALUES ('01/03/2013',2); 
INSERT @table VALUES ('01/03/2013',5); -- duplicate date,taskid 
INSERT @table VALUES ('01/03/2013',5); -- duplicate date,taskid 
SET NOCOUNT OFF; 

SELECT A.* 
FROM @table A 
    INNER JOIN (
     SELECT [ActivityDate], TaskId 
     FROM @table 
     GROUP BY [ActivityDate], TaskId 
     HAVING Count(*) > 1 
    ) AS B ON B.[ActivityDate]=A.ActivityDate AND B.TaskId=A.TaskId; 
相關問題