Question

I ai une requête SELECT multi-table qui compare les valeurs des colonnes avec lui-même, comme ci-dessous:

SELECT * FROM table1 t1,table2 t2
      WHERE t1.col1=t2.col1  --Different tables,So OK.
      AND t1.col1=t1.col1    --Same tables??
      AND t2.col1=t2.col1    --Same tables??

Ce me semble redondant. Ma requête est, leur suppression ont un impact sur la logique / performance?

Merci à l'avance.

Était-ce utile?

La solution

Cela semble redondant, son effet ne supprime les lignes qui ont des valeurs NULL dans ces colonnes. Assurez-vous que les colonnes ne sont pas NULL avant la suppression de ces clauses.

Si les colonnes sont annulable en toute sécurité, vous pouvez remplacer ces lignes avec (plus facile à lire, plus facile à entretenir):

  AND t1.col1 IS NOT NULL
  AND t2.col1 IS NOT NULL


Mise à jour à la suite de commentaires de Jeffrey

Vous avez tout à fait raison, je ne sais pas comment je ne voyais pas moi-même: la condition de jointure t1.col1=t2.col1 implique que seules les lignes avec les colonnes de jointure ne sera considérée comme nulle. Les clauses tx.col1=tx.col1 sont donc totalement redondants et peuvent être supprimés en toute sécurité.

Autres conseils

Ne pas les supprimer jusqu'à ce que vous comprenez l'impact. Si, comme d'autres pointent, ils ont aucun effet sur la requête et sont probablement optimisés sur, il n'y a pas de mal à les laisser là, mais il peut être mal à les supprimer.

Ne pas essayer de réparer quelque chose qui fonctionne jusqu'à ce que votre sacrément sûr que vous n'êtes pas casser quelque chose d'autre.

La raison pour laquelle je mentionne cela parce que nous avons hérité d'une application de reporting existant qui avait exactement cette construction, le long des lignes de:

where id = id

Et, étant un sage ami, je n'abandonné, pour découvrir que le moteur de base de données n'a pas été la seule chose en utilisant la requête.

Il a d'abord passé par un pré-processeur qui extrait chaque colonne qui existait dans une clause de where et a assuré qu'ils ont été indexés. Fondamentalement, une base de données mise au point automatique.

Eh bien, imaginez notre surprise sur la prochaine itération lorsque la base a ralenti à une fraction de son ancienne vitesse lorsque les utilisateurs ont fait des requêtes ad hoc sur le terrain de id: -)

Il se trouve que ce fut un put de bidouille par l'équipe de soutien précédente pour assurer requêtes ad hoc communes ont été en utilisant des colonnes indexées et, même si aucune de nos requêtes standard fait.

Alors, je ne vous dis ne peuvent pas le faire, tout ce qui suggère que ce pourrait être une bonne idée de comprendre pourquoi il a été mis en premier.

  1. Oui, les conditions sont évidemment redondantes car ils sont! Identiques

    SELECT * FROM table1 t1,table2 t2
    WHERE t1.col1=t2.col1
    
  2. Mais vous avez besoin d'au moins un d'entre eux. Sinon, vous auriez une jointure cartésienne sur vos mains: chaque ligne de table1 sera joint à chaque ligne de table2. Si table1 avait 100 lignes, et table2 a 1000 lignes, la requête résultante retournerait 100.000 résultats.

    SELECT * FROM table1 t1,table2 t2 --warning!
    
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top