web-dev-qa-db-ja.com

最大日付を持つGROUP BY

このコードを実行すると問題が発生します。

SELECT * FROM tblpm n 
WHERE date_updated=(SELECT MAX(date_updated) 
FROM tblpm GROUP BY control_number 
HAVING control_number=n.control_number)

基本的に、各管理番号の最新の日付を返します。上記のクエリは正しい出力を返しますが、37秒かかります。出力が表示される前。

上記のクエリよりも高速に実行できる他のsql句またはコマンドはありますか?

前もって感謝します。

48
J-J

サブクエリをWHERE句に入れてn.control_numberに制限すると、サブクエリが何度も実行されます。これは、相関サブクエリと呼ばれ、多くの場合、パフォーマンスを低下させます。

FROM句でサブクエリを1回実行して、コントロール番号ごとの最大日付を取得することをお勧めします。

SELECT n.* 
FROM tblpm n 
INNER JOIN (
  SELECT control_number, MAX(date_updated) AS date_updated
  FROM tblpm GROUP BY control_number
) AS max USING (control_number, date_updated);
109
Bill Karwin

そのサブクエリでグループ化する必要はありません... where句で十分です:

SELECT * FROM tblpm n
WHERE date_updated=(SELECT MAX(date_updated)
    FROM tblpm WHERE control_number=n.control_number)

また、「date_updated」列にインデックスがありますか?それは確かに役立ちます。

17
Micah Hahn