2

当我只想在满足特定条件的情况下加入时,如何加入多个表?

例子:

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

现在这就是它变得棘手的地方......

ORDER_TABLE
ID          ORDER_NAME
000001      ORDER1
003320      ORDER2

CATALOG_TABLE
ID          CATALOG_NAME
992002      CATALOG1
993004      CATALOG2
994002      CATALOG3

我想做的事:

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

事实上,我需要连接的不仅仅是订单表和目录表,但这是一个示例,可让您了解如何执行连接逻辑以满足条件。

我尝试使用多个选择(table_b b、table_b b1、table_b b2 等)从外部连接表,但是,我似乎无法弄清楚是否有一种方法可以对连接进行语法处理,以便只有在 a满足条件 - 将 B1.REF_ID 加入 ORDER_TABLE.ID;但仅当 B1.REF_TYPE='ORDER' 时。

任何人都可以帮忙吗?

4

3 回答 3

0

像这样的东西应该使用MAXwith CASEand GROUP BY,以及 using 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

SQL 小提琴演示

于 2013-04-30T01:22:46.357 回答
0

您可以结合使用 coalesce() 和左连接来完成此操作。这是一个sql server 示例,但我用 oracle 完成了它。

于 2013-04-30T02:14:38.180 回答
0

如果我了解您要执行的操作,请将条件放在 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

这是一个SQLFiddle

于 2013-04-30T03:16:27.410 回答