2017-05-05 41 views
-1

我想在其中發生具有相同daycause這是在表中不止一次日誌表匹配任何條目。我寫的查詢已取得重複,我的問題是,我需要有權訪問表中結果的所有列爲以後的JOINs。表看起來像這樣:自聯接查找重複,但包括所有列

| ID | DATE  | CAUSE | USER | ... | 
|--------------------------------------| 
| x | 2017-01-01 | aaa | 100 | ... | 
| x | 2017-01-02 | aaa | 101 | ... | 
| x | 2017-01-03 | bbb | 101 | ... | 
| x | 2017-01-03 | bbb | 101 | ... | 
| x | 2017-01-04 | ccc | 101 | ... | 
| x | 2017-01-04 | ccc | 101 | ... | 
| x | 2017-01-04 | ccc | 101 | ... | 
| x | 2017-01-05 | aaa | 101 | ... | 
| .....................................| 
| .....................................| 
| .....................................| 

查詢:

SELECT logs.* FROM 
    (SELECT day, cause FROM logs 
     GROUP BY day, cause HAVING COUNT(*) > 1) AS logsTwice, logs 
WHERE logsTwice.day = logs.day AND logsTwice.cause = logs.cause 

子選擇取完全正確的數據(日期和原因),但是當我試圖讓這些比賽的附加列,我得到完全錯誤的數據。我究竟做錯了什麼?

+0

除了一個事實,即聯接語法是嚴重過時,它看起來像它應該工作。鑑於數據集,你回來了什麼? – Simon

+0

請閱讀並在[mcve]上採取行動。特別顯示DDL,DML,輸入,輸出和預期輸出。 – philipxy

回答

0

你可以使用窗口功能:

SELECT l.* 
FROM (SELECT l.*, 
      COUNT(*) OVER (PARTITION BY day, cause) as cnt 
     FROM logs l 
    ) l 
WHERE cnt > 1; 

一般情況下,窗口功能會比使用JOINGROUP BY等效查詢更好的性能。

0

試試這個:

SELECT logs.* FROM logs 
inner join 
(SELECT day, cause FROM logs GROUP BY day, cause HAVING COUNT(*) > 1) logsTwice 
on logsTwice.day = logs.day AND logsTwice.cause = logs.cause 
相關問題