2014-06-25 192 views
0

我有以下查询:SQL查询 - GROUP BY查询

SELECT directory_auth_id, first_name, last_name, COUNT(user_info.directory_auth_id) as Duplication 
    FROM user_info 
GROUP BY directory_auth_id, first_name, last_name 
HAVING COUNT(*) > 1 
ORDER BY directory_auth_id ASC 

这给了我想要的结果,并表明我符合条件的它不这样做。什么所有记录,是展示我所有的记录..我如何查看所有匹配的记录。

谢谢, Boardman。

+0

你明白'GROUP BY'是?因为当第一次使用“GROUP BY”时听起来很奇怪,然后要求选择所有行。 – zerkms

+1

所有匹配什么记录?这是在MySQL或SQL服务器,这是2个不同的数据库。 – drneel

+0

如果您使用COUNT,则必须进行分组。如果你唯一的标准是一个领域的数量,那么你可以做的不多,不要限制结果。您只需转储不带COUNT的整个数据集。 – durbnpoisn

回答

1

仅适用于SQL服务器...

要仅显示与存在一次以上的directory_auth_id所有行,你必须确定哪些directory_auth_id有重复,然后使用该结果集,作为一个过滤器上的主表。

这将做到这一点。

;WITH DUPES 
AS 
(
    SELECT directory_auth_id 
    FROM user_info 
    GROUP BY directory_auth_id 
    HAVING COUNT(*) > 1 
) 

SELECT directory_auth_id, first_name, last_name 
FROM user_info T1 
JOIN DUPES T2 ON T1.directory_auth_id = T2.directory_auth_id 
+0

不会在MySQL中工作,虽然 – TMNT2014

+0

甚至没有注意到标签! – JiggsJedi

0

这可能适合你。

SELECT * FROM user_info where (directory_auth_id,first_name,last_name) in (
SELECT directory_auth_id, first_name, last_name 
FROM user_info 
GROUP BY directory_auth_id, first_name, last_name 
HAVING COUNT(*) > 1 
) 
ORDER BY directory_auth_id ASC 
+1

您不能在IN()语句中使用多个列。 – JiggsJedi

+0

结果!!!这给了我完全想要的结果...总是忘记使用'IN'语句的数量。 – Boardman411

+0

要检查()列表中是否有多列工作,请测试以下工作。不同的系统可能有不同的工作方式,但这对我很有用。 SELECT * FROM dual d WHERE(d.dummy,d.dummy)IN(SELECT dummy,dummy FROM dual); – user3772544

1

假设SQL Server的标签是正确的,最好的方法是使用窗口功能:

select ui.* 
from (select ui.*, count(*) over (partition by directory_auth_id, first_name, last_name) as cnt 
     from user_info ui 
    ) ui 
where cnt > 1 
order by cnt desc, directory_auth_id, first_name, last_name; 

不幸的是,MySQL不支持这个ANSI标准功能。但还有其他方法可以解决这个问题。

+0

这是否比大型记录集上的CTE方法更快?谢谢 - 我总是喜欢阅读你的答案。 – JiggsJedi

+0

@JiggsJedi。 。 。在SQL Server中,CTE不会影响性能。有理由相信窗口函数比'group by' /'join'方法更优化。可能还有其他方法(特别是使用'not exists'),也可能有很好的性能。 –

+0

谢谢戈登。 – JiggsJedi

0

请尝试以下操作,这会将您的查询放入内联视图中,然后根据三个相关字段将其加入到内联视图中。因此,您将从user_info获取具有多于一行(directory_auth_id,first_name,last_name)组合的所有记录。

select x.* 
    from user_info x 
    join (select directory_auth_id, 
       first_name, 
       last_name, 
       count(*) as duplication 
      from user_info 
     group by directory_auth_id, first_name, last_name 
     having count(*) > 1) y 
    on x.directory_auth_id = y.directory_auth_id 
    and x.first_name = y.first_name 
    and x.last_name = y.first_name 
0

这是MSSQL:

select 
    directory_auth_id, 
    first_name, 
    last_name, 
    case when count(user_info.directory_auth_id) 
      over (partition by directory_auth_id, first_name, last_name) > 1 
     then count(user_info.directory_auth_id) 
      over (partition by directory_auth_id, first_name, last_name) 
    end as Duplication 
from user_info;