2017-05-05 5 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 
関連する問題