Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 返回多个列不不同的所有行/列_Sql_Sql Server - Fatal编程技术网

Sql 返回多个列不不同的所有行/列

Sql 返回多个列不不同的所有行/列,sql,sql-server,Sql,Sql Server,我有一个查询,希望在其中查找ActivityDate和TaskId同时具有多个条目的行: SELECT ActivityDate, taskId FROM [DailyTaskHours] GROUP BY ActivityDate, taskId HAVING COUNT(*) > 1 上述查询似乎有效。但是,我希望所有列现在只返回两个(ActivityDate、taskId)。这不起作用: SELECT * FROM [DailyTaskHo

我有一个查询,希望在其中查找ActivityDate和TaskId同时具有多个条目的行:

SELECT
    ActivityDate, taskId
FROM
    [DailyTaskHours]
GROUP BY
    ActivityDate, taskId
HAVING 
    COUNT(*) > 1
上述查询似乎有效。但是,我希望所有列现在只返回两个(ActivityDate、taskId)。这不起作用:

SELECT *
FROM
    [DailyTaskHours]
GROUP BY
    ActivityDate, taskId
HAVING 
    COUNT(*) > 1
因为许多列不在GROUPBY子句中。我不希望任何列受到计数(*)大于1(ActivityDate、taskId除外)的影响

如何实现这一点?

以下是显示以下查询的示例:

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

您在加入条款中缺少ActivityDate我提供了答案。这恰好与您在大约2000万年前删除的问题的答案完全相同。@Linger我不理解原始查询要求的不同结果。并且假设
dailytaskhurs
有一个主键,这是最佳实践,那么
DISTINCT
将没有效果。但是,当然,如果需要,可以很容易地添加
DISTINCT
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
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
)
-- 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;