2012-09-06 3 views
-1

J'ai 4 tables et je voudrais retourner les tables de la manière la plus efficace où les touches correspondent à leurs entrées correctes.Rejoindre des tables et retourner 2 entrées séparées avec des valeurs NULL

Tableau A colonnes:

[ SVC_PREFIX | SVC_CD | ... ] 

Tableau Colonnes B:

[ SVC_PREFIX | SVC_CD | SVC_ID |... ] 

Tableau Colonnes C:

[ SVC_ID | ... ] 

Tableau colonnes D:

[ SVC_ID | ... ] 

Le tableau A est mappé au tableau B par SVC_PREFIX et SVC_CD Le tableau B est alors responsable de la récupération des tables C et D via SVC_ID Les tables C et D sont presque identiques, sauf que le tableau D comporte quelques colonnes de moins que C Par exemple, C peut avoir un isGood et isSilly mais D aura seulement isSilly. Est-il possible de récupérer les entrées de sorte que D sera tiré avec une valeur NULL pour isSilly alors que C apportera les données correspondantes?

Voici un exemple: Tableau A colonnes:

[ SVC_PREFIX | SVC_CD | anotherData ] 
[ 111 | 123 | AAA ] 

Tableau colonnes B:

[ SVC_PREFIX | SVC_CD | SVC_ID ] 
[ 111 | 123 | 007] 

Tableau Colonnes C:

[ SVC_ID | isGood | isHappy ] 
[ 007 | Y | Y ] 

colonnes Tableau D:

[ SVC_ID | isGood ] 
[ 007 | Y ] 

données Je voudrais récupérer:

[ SVC_PREFIX | SVC_CD | anotherData | SVC_ID | isGood | isHappy ] 

Les données réelles

[ 111 | 123 | AAA | 007 | Y | Y ] 
[ 111 | 123 | AAA | 007 | Y | NULL ] 

Je voudrais afficher à la fois C et la table D'comme des lignes séparées.

Actuellement, j'ai une jointure implicite, mais ne sont pas le résultat que je veux ...

SELECT * 
FROM A,B,C,D 
WHERE A.SVC_PREFIX = B.SVC_PREFIX 
AND A.SVC_CD = B.SVC_CD 
AND B.SVC_ID = C.SVC_ID 
AND B.SVC_ID = D.SVC_ID 
AND C.SVC_ID = D.SVC_ID 

Merci pour l'aide!

+0

Remarque: les bases de données ont des clés. Et les types forts. Il semble que vous pourriez JOIN A & B, et à gauche rejoindre B & C et B & D (ou C & D). – wildplasser

+0

D'où provient cet enregistrement de '[111 | 123 | AAA | 007 | Y | NULL] '? je veux dire pourquoi il y a le 'null'? –

+0

@JohnWoo Cet enregistrement n'existe pas techniquement.Cependant, le null est là pour montrer que c'est à partir de la table D où il est essentiellement les mêmes données à celle de C sauf qu'il n'a pas, pour cette instance, isHappy – bigbitecode

Répondre

1

Vous pouvez utiliser une UNION. Je crois que cela fonctionnerait dans SQL Server.

SELECT A.SVC_PREFIX, B.SVC_CD, A.anotherData, CD.SVC_ID, CD.isGood, CD.isHappy 
FROM A 
JOIN B ON B.SVC_PREFIX = A.SVC_PREFIX AND B.SVC_CD = A.SVC_CD 
JOIN 
(
    SELECT SVC_ID, isGood, isHappy 
    FROM C 

    UNION 

    SELECT SVC_ID, isGood, NULL AS isHappy 
    FROM D 
) AS CD ON CD.SVC_ID = B.SVC_ID 
+0

Génial. Je pense que cela a fait le travail. Ce qui a aidé le plus a été le JOIN (* une autre requête va ici *) et la commande NULL AS qui utilise par défaut une colonne comme NULL. – bigbitecode

0

Essayez avec JOIN (jointure interne):

SELECT * 
FROM A 
JOIN B ON B.SVC_PREFIX = A.SVC_PREFIX 
JOIN C ON C.SVC_ID = B.SVC_CD 
JOIN D ON D.SVC_ID = C.SVC_CD 
+0

J'ai essayé cette requête, mais il ne semble pas tirer le valeurs nulles. – bigbitecode

Questions connexes