2009-09-11 5 views
1

Je travaille sur les deux tables suivantes sur Oracle 10g. Je tente une tâche plutôt simple, mais je ne peux pas obtenir ma requête correctement, peut-être en raison de mon manque de compréhension des bases. Je veux interroger le compte_no de TEMP qui n'est pas présent dans BMF.Recherche du nombre manquant entre les tables dans SQL

Deux tableaux: Tableau 1: BMF: 1372 lignes

account_no | trans_amount | tracking_id 

8149817  | 8100   |  72422912 

8197743  | 9100   |  72422913 

7165129  | 8100   |  72422914 

8625861  | 8100   |  72422915 

8463378  | 2100   |  72422916 

8213330  | 3100   |  72422917 

Tableau 2: Température: 1373 lignes - Il n'y a qu'un seul account_no en TEMP qui manque de BMF

account_no 

8149817 

8197743 

7165129 

8625861 

8463378 

8213330 

84633 

48 

attendu résultat: 8463348 - Comme ce numéro n'est pas présent dans la table BMF.

Ma Recherche:

select a1.account_no from TEMP a1, bmf a2 
where a2.tracking_id between 72422912 and 72424283 
and a1.account_no != a2.account_no 

Tous les pointeurs, avec une requête correcte sera utile

Cordialement, novice

Répondre

1
SELECT account_no 
FROM TEMP 
WHERE acount_no NOT IN (SELECT account_no FROM BMF) 
+0

+1: Ceci est la façon la plus simple et –

1

Essayez

select a1.account_no from TEMP a1 left join bmf a2 
where a2.tracking_id between 72422912 and 72424283 
and a2.account_no = NULL 

utiliser un lef t rejoignez et ne prenez que les entrées qui n'ont pas d'entrée correspondante

+0

+1 la plus claire. C'est ce que je pensais mais déjà répondu par vous :) – shahkalpesh

1

Votre syntaxe de jointure est discouraged par Oracle pour les jointures externes.

Vous pouvez faire une jointure externe gauche et exclure les colonnes non jointes; cela devrait être l'approche la plus efficace. Quelque chose comme ceci:

SELECT a1.account_no FROM TEMP a1 
LEFT JOIN bmf a2 ON a1.account_no = a2.account_no 
WHERE (a2.tracking_id between 72422912 and 72424283) 
AND a2.account_no IS NULL 
+0

pouvez-vous ajouter une référence au commentaire «découragé par Oracle»? – akf

+0

Je préfère avoir une requête NOT EXIST ou NOT IN (l'OP demande explicitement des lignes "de TEMP qui n'est pas présent dans BMF"). Le synthax avec OUTER JOIN + NULL est gênant –

+0

@Vincent: l'habitude d'utiliser NOT IN avec une requête supplémentaire peut rapidement mener à une requête interne imbriquée, qui est un tueur de performance complet. Puisque nous parlons de SQL, nous sommes supposés traiter avec des ensembles, et non avec des constructions procédurales en boucle ... – Lucero

3
SELECT account_no FROM temp 
WHERE NOT EXISTS (SELECT account_no FROM bmf 
        WHERE bmf.account_no = temp.account_no) 


Cela aura le même plan d'exécution que SQL dans d'autres réponses ici, mais il affirme l'intention plus clairement (au moins pour moi).

3

Vous voulez toutes les valeurs de colonne, qui sont dans un ensemble de données (temp) mais pas dans un autre (bmf)? C'est ce que fait le "Minus" operator.

select account_no from TEMP 
minus 
select account_no from bmf 

EDIT: ajouté lien doc

Questions connexes