Oracle: Vérifier si les lignes existent dans une autre table
J'ai une requête de joindre plusieurs tables et le retour de quelques colonnes.
Une colonne indexée d'un autre tableau de références de la PK de l'une de ces tables jointes. Maintenant, je voudrais ajouter une autre colonne de la requête que les états-unis si au moins une ligne avec l'ID existe dans la nouvelle table.
Donc, si j'ai une de ces vieilles tables
ID
1
2
3
et la nouvelle table
REF_ID
1
1
1
3
alors que je voudrais obtenir
ID REF_EXISTS
1 1
2 0
3 1
Je peux penser à plusieurs façons de le faire, mais ce qui est le plus élégant/efficace?
MODIFIER
J'ai testé les performances des requêtes fournies avec 50.000 enregistrements dans la table ancienne, tous les autres disques jumelés par deux lignes dans la table, donc la moitié des dossiers ont REF_EXISTS=1.
Je suis en ajoutant la moyenne des résultats est que les commentaires à la suite des réponses au cas où quelqu'un est intéressé. Merci à tous!
OriginalL'auteur Peter Lang | 2009-12-16
Vous devez vous connecter pour publier un commentaire.
Une autre option:
Celui-ci est le plus rapide de la requête, la moyenne des temps de test de 0,06 s. Et pas besoin d'un GROUPE à l' 🙂
OriginalL'auteur Shannon Severance
Je voudrais:
À condition d'avoir des indices sur le PK et FK, vous vous en sortirez avec une analyse de la table et de la recherche d'index.
Ce qui concerne
K
OriginalL'auteur Khb
Un
join
pourrait retourner plusieurs lignes pour un id, comme il le fait pourid=1
dans les données d'exemple. Vous pouvez le limiter à une seule ligne par id avec un groupe par:La
group by
assure il n'y a qu'une seule ligne par id. Etcount(distinct t2.ref_id)
sera 1 si une ligne est trouvée, et 0 sinon.EDIT: Vous pouvez réécrire sans
group by
, mais je doute que se font les choses easer:Mon expérience dit d'utiliser la première pour le meilleur rendement. Si vous avez un index sur t2.ref_id oracle devrait être assez intelligent pour l'utiliser. Assurez-vous d'utiliser EXPLIQUER le PLAN que vous choisissez.
Vous êtes à droite, la première a été plus efficace dans mon test (0,20 s). Il n'a pas utiliser l'index sur t2.ref_id, en fournissant l'astuce pour l'utiliser a abouti à la même performance (différent de l'exécution du plan, tout de même). La deuxième requête est la seule condition que les besoins de l'index sur t2.ref_id (0,25 s), alors que l'indice n'existe pas, il faut environ 3 minutes 🙂
OriginalL'auteur Andomar
Utilisation:
Ajouté
DISTINCT
pour s'assurer que des lignes uniques sont affichés.OriginalL'auteur OMG Ponies