2016-09-22 11 views
2

テーブルの重複したエントリを削除しようとしています。結合後にSQLが重複して表示される

私がそれをやろうとしている:

SELECT items.id, b.title FROM b WHERE b.title IN (
SELECT b.title FROM b LIMIT 20 GROUP BY b.title HAVING COUNT(*)>1 
) INNER JOIN items USING (number) 

注:number「アイテム」と結合するために使用さ「B」のテーブルに共通の指標です。

しかし、明らかに動作しません。私は重複を取得し、結合結果を返す方法を理解しようとしています。

出力の例は次のようになります。私は似たような次のようなクエリを使用して数回を達成しました

id | title 
----|---- 
001 | House 
002 | House 
005 | Tree 
010 | Tree 
006 | Car 
007 | Car 
+0

あなたはどのRDBMSを使用していますか? – EoinS

+1

それはなぜLIMITですか? – jarlh

+0

MySqlとLIMITはデバッグ用にのみ存在します.20はテストのためにいくつかの重複を取得するのに適しています – GiuseppeP

答えて

2

COUNT(*)を使用したサブクエリでは、オーバーヘッドが発生します。私がお勧めします:

SELECT i.id, b.title 
FROM b JOIN 
    items i 
    USING (number) 
WHERE EXISTS (SELECT 1 
       FROM b b2 
       WHERE b2.title = b.title AND b2.id <> b.id 
      ); 

これはbは、サブクエリで使用されている各行、上の一意のIDを持っていることを前提と想定しません。このクエリでは、b(title, id)のインデックスを使用できます。

+0

ありがとう、最初の部分は明らかでした、 。これは、正しい要素を選択する方法を非常にうまく説明しました – GiuseppeP

0

。あなたは、このようにそれを行うことができます

SELECT id 
     ,title 
    FROM some_table AS T1 
WHERE (SELECT COUNT(1) 
      FROM some_table AS T2 
     WHERE T1.title = T2.title) > 1 
1

SELECT id, title 
FROM b INNER JOIN items USING number 
WHERE title IN 
    (SELECT title 
    FROM b 
    GROUP BY title 
    HAVING COUNT(*) > 1) 
関連する問題