2013-04-30 60 views
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_bb,table_b1,table_b2等)加入表的外部连接,但是,我似乎无法弄清楚是否有方法来语法连接,以便你可以仅当条件满足时才加入 - 将B1.REF_ID加入ORDER_TABLE.ID;但只有当B1.REF_TYPE ='ORDER'时。

任何人都可以帮忙吗?

+0

将额外的条件放在'WHERE'子句中。 – Barmar 2013-04-30 01:19:12

+0

显示您尝试的查询。 – Barmar 2013-04-30 01:19:58

回答

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 

SQL Fiddle Demo

+0

无法使用Max ... 您能解释Max如何在这种情况下工作吗? http://sqlfiddle.com/#!4/0fcca/10 – Jjavitz 2013-04-30 03:54:07

+0

@Jjavitz - 请参阅编辑以及SQL Fiddle演示更新。最好的祝福。 – sgeddes 2013-04-30 12:37:49

+0

谢谢。我仍然不确定MAX是如何处理字符串的,但至少我知道它是如何工作的。 – Jjavitz 2013-04-30 14:59:58

0

你可以用()聚结的组合和左加入做到这一点。这是一个sql server example,但我已经用oracle做了。

0

如果我理解你想要做什么,把条件开子句中:

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

+0

嗯...我早些时候尝试过,但我使用的视觉生成器是嵌套连接进行优化,由于某些原因,ON不喜欢AND并且不会导致查询结果。我会看看如果un-nesting有助于解决这个问题。 (A = B和B ='B') 将是正确的语法吗?还是应该把它留在括号之外? – Jjavitz 2013-04-30 03:37:42

+0

括号是可选的。如果他们帮助清晰,请继续。我通常把他们排除在外。 – eaolson 2013-04-30 23:13:01

相关问题