1

このクエリの実行には時間がかかります:

SELECT host,ip FROM arecords WHERE ip IN 
   (SELECT ip FROM arecords GROUP BY ip HAVING COUNT(ip)>1 )
;

(私の arecords テーブルでは、1 つの IP に複数のホストが存在する場合があります。これらの場合、ホスト名 + IP を取得したいと考えています)

サブクエリが何度も実行されているような気がします。サブクエリを実行して結果を取得し、サブクエリをこれらの結果に置き換えると、高速です。ビューを使用することでこれを回避できることがわかりました。

1つのクエリでそれを行う方法はありますか?

[希望する結果の SQLfiddle の例: http://sqlfiddle.com/#!2/6c1bd/1/0 ]

4

2 に答える 2

6

この解決策を試してください。これにより、テーブルに複数回存在する各 IP のすべての行が取得されます。これは、外側の行ごとに 1 回実行されるFROMのサブクエリではなく、1 回実行されるのサブセレクトを使用します。WHERE

が選択された後、副選択で選択されたものと等しいip同じテーブルに結合します。結合はインデックス上で発生するため高速である必要があり、最終結果は、テーブルに複数の値を持つs に対してのみs + s を取得します。ipipFROMhostipip

SELECT 
    b.host,
    b.ip
FROM
    (
        SELECT ip
        FROM arecords
        GROUP BY ip
        HAVING COUNT(*) > 1
    ) a
INNER JOIN
    arecords b ON a.ip = b.ip AND b.active = 'T'
于 2012-06-25T11:33:57.303 に答える
2
SELECT host,ip 
FROM arecords ar 
WHERE EXISTS
    (SELECT * 
    FROM arecords ex
    WHERE ex.ip = ar.ip
    AND ex.host <> ar.host
    )
    ;
于 2012-06-25T11:35:05.930 に答える