2008-11-13 10 views
1

J'ai une jointure externe droite, qui fait presque ce que je veux ...requête se joindre à la question

SELECT 
users_usr.firstname_usr, 
users_usr.lastname_usr, 
credit_acc.given_credit_acc, 
users_usr.created_usr, 
users_usr.sitenum_usr, 
users_usr.original_aff_usr, 
users_usr.id_usr 
FROM 
credit_acc 
right Outer Join users_usr ON credit_acc.uid_usr = users_usr.id_usr 

Le problème est, je veux ajouter un

where credit_acc.type_acc = 'init' 

Mais cela se débarrasse de tous les utilisateurs qui n'ont pas de ligne dans credit_acc ... c'est pourquoi j'ai besoin d'une jointure externe droite.

Y at-il un moyen d'obtenir ceci sans avoir à faire deux requêtes et une union?

+0

Juste une note sur la convention: Je rarement (voire jamais) voir à droite rejoint - ils sont habituellement GAUCHE rejoint. Donc dans ce cas, je commencerais par users_usr, puis je quitterais joint à credit_acc. Je pense que ça se lit mieux, aussi. –

+0

Je pense que vous devez clarifier ce que vous cherchez à être retourné.Voulez-vous tous les utilisateurs où ils ont "init" OU aucun compte de crédit du tout? Les exemples de données et les résultats attendus peuvent vous aider si vous pouvez couvrir tous les scénarios possibles. –

Répondre

4
SELECT 
users_usr.firstname_usr, 
users_usr.lastname_usr, 
credit_acc.given_credit_acc, 
users_usr.created_usr, 
users_usr.sitenum_usr, 
users_usr.original_aff_usr, 
users_usr.id_usr 
FROM 
credit_acc 
right Outer Join users_usr ON credit_acc.uid_usr = users_usr.id_usr 
WHERE credit_acc.type_acc = 'init' OR credit_acc.type_acc is NULL 

Ou, comme @Tomalak a souligné:

WHERE COALESCE(credit_acc.type_acc, 'init') = 'init' 

qui peut être plus rapide (voir les commentaires).

+0

Alternativement: WHERE COALESCE (credit_acc.type_acc, 'init') = 'init' – Tomalak

+0

Bon appel - seconde l'optimisation COALESCE ici. – Skeolan

+0

@Tomalak, je n'étais pas très familier avec COALESCE mais je l'ai cherché et ajouté à la réponse, merci de m'apprendre quelque chose de nouveau. –

1

Avez-vous essayé ce qui suit?

SELECT 
users_usr.firstname_usr, 
users_usr.lastname_usr, 
credit_acc.given_credit_acc, 
users_usr.created_usr, 
users_usr.sitenum_usr, 
users_usr.original_aff_usr, 
users_usr.id_usr 
FROM 
credit_acc 
right Outer Join users_usr ON credit_acc.uid_usr = users_usr.id_usr and credit_acc.type_acc = 'init' 
+0

"et" ne fonctionne pas syntaxiquement là. Vous n'avez pas encore démarré de clause de prédicat. Cela devrait être "où". Je suppose que l'OP a essayé exactement cela mais, comme il le dit, il filtre les lignes désirées où type_acc est NULL. –

2

Si la ligne n'existe pas, credit_acc.type_acc devrait être nul. Vous pouvez essayer quelque chose comme ceci:

WHERE credit_acc.type_acc = 'init' OR credit_acc.type_acc IS NULL; 

Cela ne fonctionnera que s'il n'y a pas des champs nuls dans credit_acc.type_acc.

0

Vous voulez tous les enregistrements des deux tables, joint sur l'ID utilisateur, WHERE credit_acc est 'init' OU où il n'y a pas une ligne credit_acc à joindre? Que diriez-vous

where credit_acc.type_acc is null OR credit_acc.type_acc = 'init' 
0

Je fais le prédicat:

WHERE credit_acc.uid_usr IS NULL OR credit_acc.type_acc = 'init' 

Cela vous donne les lignes où il n'y a pas de correspondance sur UID_USR, et les lignes où il y a une correspondance et le type de compte est « init » .

L'autre solution proposée (vérifier type_acc pour NULL) vous donnerait également des lignes où il y a une correspondance sur UID_USR et la valeur réelle pour le type de compte est NULL.

Si credit_acc.type_acc ne peut pas être NULL, il n'y a pas de différence entre les deux. Si c'est possible, vous devez décider si vous souhaitez inclure ces lignes dans votre jeu de résultats. Ajoutez simplement un autre prédicat à la condition de jointure.

0

SELECT U.firstname_usr, U.lastname_usr, C.given_credit_acc, 
     U.created_usr, U.sitenum_usr, U.original_aff_usr, U.id_usr 
From credit_acc C Right Join users_usr U 
    On C.uid_usr = U.id_usr 
     And C.type_acc = 'init' 

Cela fonctionne parce que Les conditions de jointure sont appliquées avant que les documents ne correspondent pas de côté « autre » d'un « extérieur » join sont ajoutés au jeu de résultats, alors que lorsque les conditions sont appliquées après les deux tables sont jointes. ..

Cette syntaxe représente plus clairement votre intention et ...