坚持多个左连接和内连接

时间:2014-03-07 15:44:15

标签: sql oracle left-join inner-join

我要对Oracle进行查询,而且我对它有点困惑。在我的TABLE1中,我有287条记录,所以我想要来自TABLE2和TABLE3的所有信息,这些信息与我的287条记录相关(这就是我使用左连接的原因)。但我也想要所有在TABLE2和TABLE4,TABLE4和TABLE5之间匹配的记录(这就是我使用Inner Join的原因)。

但我的询问不起作用,我不知道为什么。有人可以帮帮我吗?

我的查询:

 SELECT distinct(TABLE1.NUM_SIN),      
       TABLE1.LIBELLE,
       TABLE1.DATE_FRAIS,
       TABLE2.CODE_SIN,
       TABLE2.PKPR,
       TABLE1.MT,
       TABLE4.POSTBUD,
       TABLE3.VEENG
  FROM TABLE1 
       LEFT JOIN TABLE2
                 ON TABLE2.NUM_SIN = TABLE1 .NUM_SIN
       INNER JOIN TABLE4
                 ON TABLE4.NUM_SIN = TABLE2.NUM_SIN 
                 AND TABLE4.SCSO = TABLE2.SCSO
       LEFT JOIN TABLE5
                 ON TABLE5.CDC = TABLE4.NO
                 AND TABLE5.CDEXE = TABLE4.CDEXE 
                 AND TABLE5.SCSO = TABLE4.SCSO
       LEFT JOIN TABLE3
                 ON TABLE3.CNCT = TABLE1.NUM_SIN  
 WHERE ... ;

要了解的图表:  Graph Tables

请咨询!

2 个答案:

答案 0 :(得分:1)

我认为这里的问题可能是你真的不想在你的查询中使用内连接,也许你不确切知道内连接和外连接之间的区别。

查询中的内部联接将仅返回TABLE4中与TABLE2匹配的行。连接是连续的和累积的,因此剩余的LEFT连接将在连接的左侧具有减少的行集。

因此,我相信你会想在整个查询中使用LEFT连接,例如:

 SELECT distinct(TABLE1.NUM_SIN),      
       TABLE1.LIBELLE,
       TABLE1.DATE_FRAIS,
       TABLE2.CODE_SIN,
       TABLE2.PKPR,
       TABLE1.MT,
       TABLE4.POSTBUD,
       TABLE3.VEENG
  FROM TABLE1 
       LEFT JOIN TABLE2
                 ON TABLE2.NUM_SIN = TABLE1 .NUM_SIN
       LEFT JOIN TABLE4
                 ON TABLE4.NUM_SIN = TABLE2.NUM_SIN 
                 AND TABLE4.SCSO = TABLE2.SCSO
       LEFT JOIN TABLE5
                 ON TABLE5.CDC = TABLE4.NO
                 AND TABLE5.CDEXE = TABLE4.CDEXE 
                 AND TABLE5.SCSO = TABLE4.SCSO
       LEFT JOIN TABLE3
                 ON TABLE3.CNCT = TABLE1.NUM_SIN  
 WHERE ... ;

答案 1 :(得分:0)

你确定你不想离开加入table4吗?它的编写方式只允许使用TABLE4中的值,这将限制table2和table5的结果。

注意 - 图像CDN在此过滤,因此无法看到图像。

SELECT --
FROM TABLE1 
LEFT JOIN TABLE2 ON TABLE2.NUM_SIN = TABLE1 .NUM_SIN
LEFT JOIN TABLE3 ON TABLE3.CNCT = TABLE1.NUM_SIN  

-- unless you want to reduce the number of table2 rows use left join here.
LEFT JOIN TABLE4 ON TABLE4.NUM_SIN = TABLE2.NUM_SIN AND TABLE4.SCSO = TABLE2.SCSO

LEFT JOIN TABLE5 ON TABLE5.CDC = TABLE4.NO
                AND TABLE5.CDEXE = TABLE4.CDEXE 
                AND TABLE5.SCSO = TABLE4.SCSO
WHERE ... ;