SQL Jointure Externe Complète avec Plusieurs Tables
D'abord j'ai 4 Tables
Table0, Colonnes: num, desc Le tableau 1, Colonnes: num, qty1 Table2, Colonnes: num, qty2 Tableau3, Colonnes: num, qty3 Table4, Colonnes: num, qty4
(pas tous num avoir des valeurs dans qty1 ou qty2 ou qty3 ou qty4, donc j'ai besoin d'un full join)
et ma requête:
SELECT Table0.num, SUM(Table1.qty1 ), SUM(Table2.qty2 ), SUM(Table3.qty3 ), SUM(Table4.qty4)
FROM Table0
FULL OUTER JOIN Table1 ON Table0.num = Table1.num
FULL OUTER JOIN Table2 ON Table0.num = Table2.num
FULL OUTER JOIN Table3 ON Table0.num = Table3.num
FULL OUTER JOIN Table4 ON Table0.num = Table4.num
GROUP BY Table0.num
En quelque sorte son retour juste 1 ligne de données:
num | qty1 | qty2 | qty3 | qty4 | --------------------------------- | 100 | 20 | 77 | 969 |
Mais j'attendais comme l'exemple au
http://www.w3schools.com/sql/sql_join_full.asp
comme:
num | qty1 | qty2 | qty3 | qty4 | --------------------------------- 1 | 0 | 2 | 3 | 2 | 2 | 1 | 0 | 0 | 0 | 3 | 7 | 0 | 9 | 0 | 4 | 0 | 0 | 0 | 10 | 5 | 0 | 0 | 7 | 0 | 6 | 8 | 2 | 9 | 3 | 7 | 0 | 1 | 0 | 0 |
(Je ne sais pas ce qui résout c')
Cependant, je dois similaire au résultat de la case ci-dessus en changeant tous les tableaux:
Le tableau 1, Colonnes: num, qty1, qty2, qty3, qty4 Table2, Colonnes: num, qty2, qty1, qty3, qty4 Tableau3, Colonnes: num, qty3, qty1, qty2, qty4 Table4, Colonnes: num, qty4, qty1, qty2, qty3
- C'est assez impressionnant que c'est le retour des données à tous, étant donné que MySQL ne supporte pas
FULL OUTER JOIN
. - Aurait besoin de nous montrer les lignes dans ces tables. Il semblerait Table0.num contient la valeur null ou des espaces au lieu des valeurs que vous attendez.
- Table0.num a pas de nulle valeurs vides
- Table1~4.num 's de valeur sont égales à une des valeurs dans Table0.num
- Vous êtes clairement pas l'utilisation de MySQL si cette instruction s'exécute sans erreur.
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin de faire une de deux choses (et ces deux supposer que
Table0
a toutes les instances denum
) -Si toutes les lignes sont déjà en faisant la somme de la "feuille" tables (1 - 4), alors qu'un simple
LEFT JOIN
(avec unCOALESCE()
dans le sélectionner) suffira - vous n'avez même pas besoin de laGROUP BY
.Si vous avez besoin des lignes de résumé, vous allez avoir besoin de la somme de leur avant le rejoindre, étant donné que dans le cas contraire plusieurs lignes par num dans les différents tableaux de causer les résultats de multiplier.
Quelque chose comme ceci:
(travail SQLFiddle exemple)
Il n'existe aucune concordance entre le nombre de colonnes dans chaque tableau et ainsi vous obtenez l'extérieur des enregistrements. Comme quand il n'y a pas de match sur le match clé, les dossiers sont affichés avec cette colonne nulle.
La façon dont vous jointure externe complète, Table0.num aurait besoin d'exister dans TOUS les autres tables. I. e. si nombre == 1 est seulement dans Table0 et Table1, mais pas Table2 et 3, il ne sera pas le match sur les 4 et ainsi être null num.
Ce que vous voulez probablement, c'est quelque chose de plus comme
Ma syntaxe peut être un peu large et il y a sans doute des moyens plus efficaces. Mais l'idée générale est de vous faire une sous-requête pour chaque relation, car ils sont indépendants.
Il y a un solution. Vous pouvez ajouter une table à se joindre à vos tables. Par exemple:
Tablex
; colonnes:tablex_id (PK, AI)
(table nouvellement créée)Table0
; colonnes:tablex_id, num, desc
(ajouté que la nouvelle zone tablex_id')Table1
; colonnes:tablex_id, num, qty1
(ajouté que la nouvelle zone tablex_id')Table2
; colonnes:tablex_id, num, qty2
(ajouté que la nouvelle zone tablex_id')Table3
; colonnes:tablex_id, num, qty3
(ajouté que la nouvelle zone tablex_id')Table4
; colonnes:tablex_id, num, qty4
(ajouté un nouveau champ 'tablex_id')Chaque fois que vous ajoutez un enregistrement à
Table0
,Table1
,Table2
,Table3
etTable4
, vous devez ajouter un enregistrement à laTablex
première et d'obtenir lestablex_id
et la mettre dans votre table(s) en conséquence.Si vous souhaitez les rejoindre, il suffit de faire quelque chose comme ceci: