2014-06-25 241 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;