6
votes

Oracle: Vérifiez si des rangées existent dans une autre table

J'ai une requête joignant plusieurs tables et retourner quelques colonnes.

Une colonne indexée d'une autre table fait référence à la PK de l'une de ces tableaux jointes. Maintenant, je voudrais ajouter une autre colonne à la requête indiquant que si au moins une ligne avec cet identifiant existe dans la nouvelle table. P>

Donc, si j'ai une des tables anciennes p>

ID   REF_EXISTS
 1            1
 2            0
 3            1


0 commentaires

4 Réponses :


2
votes

Utilisation: xxx

ajouté distinct pour assurer uniquement des lignes uniques sont affichées.


1 commentaires

Merci, la version mise à jour a pris environ 0,17 ans dans mon test.



1
votes

A rejoindre pourrait renvoyer plusieurs lignes pour un identifiant, comme pour ID = 1 dans l'exemple de données. Vous pouvez la limiter à une ligne par carte d'identité avec un groupe par: xxx

le groupe par garantit qu'il n'y a qu'une seule ligne par pièce d'identité. Et comptage (distinct t2.ref_id) sera 1 si une ligne est trouvée et 0 sinon.

EDIT: Vous pouvez le réécrire sans groupe >, mais je doute que cela faciliterait les choses: xxx


3 commentaires

Oui, cela fonctionnerait. Mais j'aimerais éviter le groupe, car je sélectionne des 30 autres colonnes ... toute autre idée?


Mon expérience dit utiliser le premier pour une meilleure efficacité. Si vous avez un index sur t2.ref_id oracle devrait être assez intelligent de l'utiliser. Assurez-vous d'utiliser Explan Plan comme vous le souhaitez.


Vous avez raison, le premier était plus efficace dans mon test (0,20). Il n'a pas utilisé l'index sur t2.ref_id, en fournissant l'indice à utiliser qui a entraîné la même performance (plan d'exécution différent, cependant). La deuxième requête est la seule à condition que l'indice ait besoin de l'index sur t2.ref_id (0,25s), lorsque l'index n'existe pas, il faut environ 3 minutes :)



8
votes

Une autre option: xxx


2 commentaires

+1 Depuis que vous m'avez battu par 7 minutes avec cette requête. Celui-ci est joliment des groupes Ref_id's avant l'externe rejoignant l'ensemble sur Old_Table. J'utiliserais nvl2 (n.ref_id, 1,0) au lieu de votre expression de cas cependant.


Celui-ci est la requête la plus rapide, temps de test moyen de 0,06S. Et pas besoin de groupe par :)



4
votes

Je voudrais: xxx

à condition que vous disposiez d'index sur le PK et le FK, vous vous éloignerez avec une recherche de table et des recherches d'index.

K


0 commentaires