如果满足特定条件,我只想加入时如何连接多个表?

时间:2013-04-30 01:17:15

标签: sql oracle

如果满足特定条件,我只想加入时如何加入多个表?

示例:

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等)对表进行外连接,但是,我似乎无法弄清楚是否有一种方法来对连接进行语法处理以便您可以加入只有满足条件 - 将B1.REF_ID加入ORDER_TABLE.ID;但只有当B1.REF_TYPE ='ORDER'时。

有人可以帮忙吗?

3 个答案:

答案 0 :(得分:0)

使用MAXCASEGROUP BY一起使用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 时,此类内容应该有效:

{{1}}

SQL Fiddle Demo

答案 1 :(得分:0)

您可以使用coalesce()和left join的组合来完成此操作。这是sql server example,但我已经用oracle完成了。

答案 2 :(得分: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