2 votes

Comment joindre plusieurs tables lorsque je ne veux le faire que si une condition particulière est remplie ?

Comment joindre plusieurs tables lorsque je ne veux le faire que si une condition particulière est remplie ?

Exemple :

TABLE A
NUM    TYPE
1      DUPLICATE
2      DUPLICATE
3      INTERACT

TABLE B
ID     REF_TYPE     REF_ID
1      ORDER        000001
1      SEVERE       NULL
1      CATALOG      993004
2      ORDER        003320
2      CATALOG      994002
3      MILD         NULL
3      INTERACTION  NULL
3      CATALOG      992002

C'est là que les choses se compliquent...

ORDER_TABLE
ID          ORDER_NAME
000001      ORDER1
003320      ORDER2

CATALOG_TABLE
ID          CATALOG_NAME
992002      CATALOG1
993004      CATALOG2
994002      CATALOG3

Ce que je veux faire :

JOINED TABLE
NUM     TYPE          ORDER_NAME     CATALOG_NAME
1       DUPLICATE     ORDER1         CATALOG2
2       DUPLICATE     ORDER2         CATALOG3
3       INTERACT      NULL           CATALOG1

En fait, il n'y a pas que les tables de commande et de catalogue que je dois joindre, mais il s'agit d'un exemple pour vous donner une idée de la manière dont vous pouvez appliquer la logique de la jointure pour satisfaire la condition.

J'ai essayé de joindre extérieurement les tables avec des sélections multiples (table_b b, table_b b1, table_b b2, etc.), mais je n'arrive pas à comprendre s'il y a un moyen de syntaxer les jointures de façon à ce que vous puissiez joindre seulement si une condition est remplie - joindre B1.REF_ID à ORDER_TABLE.ID ; mais seulement quand B1.REF_TYPE='ORDER'.

Quelqu'un peut-il nous aider ?

0voto

Dan Bracuk Points 9529

Pour ce faire, vous pouvez utiliser une combinaison de coalesce() et de jointures à gauche. Voici un exemple de exemple de serveur sql mais je l'ai fait avec oracle.

0voto

eaolson Points 4538

Si je comprends bien ce que vous essayez de faire, placez la condition dans la clause ON :

SELECT a.num, a.type, o.order_name, c.*
  FROM table_a a
  LEFT JOIN table_b b1 ON b1.id = a.num AND b1.ref_type = 'ORDER'
  LEFT JOIN order_table o ON o.id = b1.ref_id
  LEFT JOIN table_b b2 ON b2.id = a.num AND b2.ref_type = 'CATALOG'
  LEFT JOIN catalog_table c ON c.id = b2.ref_id
 ORDER BY a.num

Voici un SQLFiddle .

0voto

sgeddes Points 29837

Cela devrait fonctionner en utilisant MAX avec CASE y GROUP BY , ainsi que l'utilisation de LEFT JOIN :

SELECT A.NUM, A.TYPE,
    MAX(CASE WHEN B.REF_TYPE = 'ORDER' THEN O.ORDER_NAME END) ORDER_NAME,
    MAX(CASE WHEN B.REF_TYPE = 'CATALOG' THEN C.CATALOG_NAME END) CATALOG_NAME
FROM TABLE_A A
    LEFT JOIN TABLE_B B ON A.NUM = B.ID
    LEFT JOIN ORDER_TABLE O ON B.REF_ID = O.ID
    LEFT JOIN CATALOG_TABLE C ON B.REF_ID = C.ID
GROUP BY A.Num, A.Type

Démonstration de SQL Fiddle

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X