web-dev-qa-db-fra.com

GROUP BY ayant la date MAX

J'ai un problème lors de l'exécution de ce code:

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

En gros, je veux renvoyer la date la plus récente pour chaque numéro de contrôle. La requête ci-dessus renvoie une sortie correcte mais prend 37 secondes. avant la sortie a été affichée.

Existe-t-il une autre clause ou commande SQL pouvant s'exécuter plus rapidement que la requête ci-dessus?

Merci d'avance.

48
J-J

Le fait de placer la sous-requête dans la clause WHERE et de la limiter à n.control_number signifie que la sous-requête est exécutée plusieurs fois. Ceci s'appelle un sous-requête corrélée, et c'est souvent un tueur de performance.

Il est préférable d'exécuter la sous-requête une fois, dans la clause FROM, pour obtenir la date maximale par numéro de contrôle.

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

Il n'est pas nécessaire de grouper dans cette sous-requête ... une clause où suffirait:

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

Aussi, avez-vous un index sur la colonne 'date_updated'? Cela aiderait certainement.

17
Micah Hahn