2008-12-23 6 views
0

J'ai une relation entre deux tables, auteurs et styles. Chaque auteur est associé à un style, avec le cas particulier où un auteur n'a pas de style (IS NULL).SELECT sur une référence NULL

La définition de la référence à NULL ne pose aucun problème, mais il existe un problème lors de l'exécution d'une requête pour sélectionner les auteurs et les styles.

Par exemple, la requête:

SELECT "authors"."id", "authors"."name", "styles"."name", "authors"."comments" FROM 
"authors" , "styles" WHERE "authors"."style" = "styles"."id" 

ne tient pas seulement les auteurs qui ont un style NULL (comme prévu).

Je dois faire une sélection qui répertorie également les auteurs avec un style NULL, comme le ferait une jointure à gauche (je ne peux pas utiliser LEFT JOIN pour certaines raisons).

Une solution n'inclut pas les jointures explicites?

Répondre

4

La solution la plus évidente est une LEFT OUTER JOIN.

Voir: http://www.postgresql.org/docs/8.1/static/tutorial-join.html

Si vous ne souhaitez pas utiliser explicitement se joindra à vous devriez être en mesure d'utiliser une UNION

SELECT "authors"."id", "authors"."name", "styles"."name", "authors"."comments" FROM 
"authors" , "styles" WHERE "authors"."style" = "styles"."id" 
UNION 
SELECT "authors"."id", "authors"."name", "", "authors"."comments" FROM 
"authors" WHERE "authors"."style" IS NULL 
0
SELECT "authors"."id", "authors"."name", "styles"."name", "authors"."comments" FROM "authors" , "styles" WHERE "authors"."style" = "styles"."id" OR "authors"."style" = null 

Avez-vous essayé?

+0

Oui, cela provoque l'auteur d'avoir une relation sera tous les styles – Kknd

0

De ma compréhension, il vous suffit d'élargir votre requête pour inclure NULL:

SELECT "authors"."id", "authors"."name", "styles"."name", "authors"."comments" 
FROM "authors" , "styles" 
WHERE "authors"."style" = "styles"."id" OR "authors"."style" IS NULL 
+0

Malheureusement, il fait l'auteur avec un style nul pour avoir une relation avec tous les styles – Kknd

1

Je pense que si vous ne pouvez pas utiliser LEFT JOIN vous devez utiliser un UNION.
Passez en revue le lien de Coding Horror, c'est assez intéressant. A Visual Explanation of SQL Joins

Questions connexes