我有以下查询:
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
这给了我想要的结果,并向我显示符合条件的所有记录。它不做的是,向我显示所有记录..如何查看已匹配的所有记录。
谢谢, 德曼。
答案 0 :(得分:1)
仅限SQL Server ...
要显示仅存在多次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
答案 1 :(得分: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标准功能。但是还有其他方法可以解决这个问题。
答案 2 :(得分: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
答案 3 :(得分: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
答案 4 :(得分: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;