J'utilise PostgreSQL. Tout ce que je lis ici suggère que dans une requête n'utilisant que des jointures complètes sur une seule colonne, l'ordre des tables jointes n'a pas d'importance. Mon intuition dit que cela devrait aussi aller pour plusieurs colonnes, à condition que chaque colonne commune soit listée dans la requête si possible (c'est-à-dire, partout où les deux tables jointes ont la colonne en commun). Mais c'est pas le cas, et j'essaie de comprendre pourquoi.Pourquoi l'ordre FULL JOIN fait-il une différence dans ces requêtes?
Simplifié à trois tables a, b et c.
Columns in table a: id, name_a
Columns in table b: id, id_x
Columns in table c: id, id_x
Cette requête:
SELECT *
FROM a
FULL JOIN b USING(id)
FULL JOIN c USING(id, id_x);
retourne un nombre différent de lignes que celui-ci:
SELECT *
FROM a
FULL JOIN c USING(id)
FULL JOIN b USING(id, id_x);
Ce que je veux/expect est difficile à articuler, mais fondamentalement, un I » d aimer une fusion complète "complète". Je ne veux pas de champs nulles à moins que cela ne soit inévitable.
Par exemple, à chaque fois qu'il y a un ID non-nul, je veux que la colonne de nom correspondant à toujours ait le nom_a et ne soit pas nulle. Au lieu de cela, l'un de ces exemples de requêtes renvoie des résultats semi-redondants, avec une ligne ayant un nom_a mais pas d'ID et une autre ayant un ID mais pas de nom_a, plutôt qu'une seule ligne fusionnée. Lorsque les jointures sont répertoriées dans l'ordre inverse, j'obtiens le résultat souhaité (mais je ne suis pas sûr des autres problèmes pouvant survenir, car les données futures sont inconnues).
Vous vous attendez à ce qu'il puisse y avoir NULL dans les tables d'entrée? Est-ce que certaines de vos attentes dépendent de FULL JOIN sur les superkeys (UNIQUE NOT NULL)? Existe-t-il d'autres restrictions/contraintes sur les tables ou les jointures? Quels sont exactement vos résultats souhaités/attendus en termes d'intrants? S'il vous plaît donnez l'exemple d'entrée, requête, et prévu/désiré et la production réelle. PS Je soupçonne qu'aucune chaîne de telles jointures n'est la requête pour le résultat que vous voulez. Je soupçonne que vous avez besoin de certains syndicats, et que OU joue un grand rôle dans vos spécifications. Essayez de décrire et donner des exemples pour ce que vous voulez pour 2 puis 3 tables. – philipxy
[Y at-il une règle empirique pour construire une requête SQL à partir d'une description lisible par l'homme?] (Https://stackoverflow.com/a/33952141/3404097) – philipxy
Vous n'êtes toujours pas clair sur ce que vous voulez dans les commentaires que vous avez écrits sur la réponse de GordonLinoff. Aussi, "S'il y a plusieurs rangées avec ..." suggère, comme je l'ai émis dans mon commentaire sur votre question, que votre situation implique certaines hypothèses * mais vous ne les avez pas données *. Les choses sont plus compliquées que vous ne le pensez. Si vous voulez une réponse à votre question, quelle qu'elle soit, veuillez lire et agir sur [mcve], puis lire et agir sur mon commentaire. À tout le moins, donnez un exemple d'entrée et de résultat attendu. En outre, les commentaires ne sont pas pour des clarifications, s'il vous plaît modifier votre question. Aussi, voir ma réponse. – philipxy