Oracle-SQL:结合LEFT和INNER JOIN

时间:2017-07-04 09:03:15

标签: sql oracle join left-join

我不知道,如何更好地解释:

我需要一个视图(在非常规范化的情况下)将ID扩展为相应的名称,因此我需要组合f.e.在以下事项中左连接内连接(参见示例)

表:

TCUSTOMER
ID|     NAME|   ANIMAL| CAR|    PROFESSION
 1|  Sheldon|         |    |    1
 2|  Leonard|         |   1|    1
 3| Howard  |         |   2|    2
 4| Radshesh|        1|    |    1
 5| Penny   |         |   3|    

TANIMAL     
ID|     NAME|   TYPE
 1| CINNAMON|   1

TANIMALTYPE 
ID| NAME
 1| DOG

ID|     NAME|   TYPE
 1| CAL-0123|   1
 2| CAL-2345|   1
 3| CAL-4567|   2

TCARTYPE    
ID| NAME
 1| FORD
 2| BMW

TPROFESSION 
1|  PHYSICIAN
2|  ENGINEER

我需要一个具有以下结果的视图:

VCUSTOMER                       
ID|    NAME|ANIMALNAME| ANIMALTYPE| CARNAME|CARTYPE|    PROFESSIONNAME
 1| Sheldon|          |           |        |       |    PHYSICIAN
 2| Leonard|          |           |CAL-0123|   FORD|    PHYSICIAN
 3|  Howard|          |           |CAL-2345|   FORD|    ENGINEER
 4|Radshesh|  CINNAMON|        DOG|        |       |    PHYSICIAN
 5|   Penny|          |           |CAL-4567|    BMW|    

我想我需要像

这样的东西
SELECT  
    C.ID, C.NAME,
    A.NAME, AT.NAME,
    CAR.NAME, CART.NAME,
    P.NAME
FROM TCUSTOMER C    
LEFT (JOIN TANIMAL A INNER JOIN TANIMALTYPE AT ON A.TYPE = AT.ID) ON A.ID = C.ANIMAL    
LEFT (JOIN TCAR CAR INNER JOIN TCARTYPE CART ON CAR.TYPE = CARTT.ID) ON CAR.ID = C.CAR  
LEFT JOIN TPROFESSION P ON P.ID = C.PROFESSION  

如何执行此操作或我需要搜索什么? “oracle嵌套连接”无法正常工作

提前致谢

1 个答案:

答案 0 :(得分:1)

你几乎做得对 - 它只是多个连接。

JOIN关键字放在括号内:

SELECT  
    C.ID, C.NAME,
    A.NAME, AT.NAME,
    CAR.NAME, CART.NAME,
    P.NAME
FROM TCUSTOMER C    
LEFT JOIN (TANIMAL A INNER JOIN TANIMALTYPE AT ON A.TYPE = AT.ID) ON A.ID = C.ANIMAL    
LEFT JOIN (TCAR CAR INNER JOIN TCARTYPE CART ON CAR.TYPE = CART.ID) ON CAR.ID = C.CAR  
LEFT JOIN TPROFESSION P ON P.ID = C.PROFESSION 

请注意,JOIN是从左到右执行的(但前面是括号)。因此,你的情况是,连接的顺序是:

{[C -> (A <-> AT)] -> (CAR <-> CART)} -> P

其中<->(内连接)表示对称关系(仅当两侧都存在时才显示值)和->(左连接)意味着左边的所有值都将出现,而从右边 - 只有匹配。