Oracle-SQL: 合并LEFT和INNER JOIN

3

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

我需要一个视图(以非常规范的方式),将ID扩展为相应的名称,以便我需要以以下方式组合左连接和内连接(请参见示例)

表格:

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 nested joins"没有用

提前感谢


感谢您美化过的文本。 - am2
1个回答

3
你做得差不多了,只需要进行多个连接。
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

<->(内连接)表示对称关系(只有两侧都存在的值才会出现),->(左连接)表示左侧所有的值都会出现,而右侧只有匹配的值会出现。


1
谢谢您的快速回复,它很好地解决了问题。有时候事情比预期的更容易理解... - am2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接