合并表数据

时间:2016-12-29 14:00:56

标签: oracle

Table1               Table2                 Table3           Table4
Sl Name City       index len bre       col tax income      price dicount org
1  ABC   XYZ       1     10   12       1   23   40          1   10      XYZ
2  DEF   asd       2     12   14       2   24   42          2   6       asd
3  ghi   jkl                           3   78   89          3    0      gah

这些条目对应于各自的表格。我想从所有4个表中获取数据,而不管表2中是否存在值。 Table2中的任何空值都不应妨碍输出。

select tab1.Name,
        tab2.len,
        tab3.tax,
        tab4.org
From Table1  tab1,
     Table2  tab2, 
     Table3  tab3,   
     Table4  tab4
where tab1.sl=tab2.index(+)
AND      tab2.index(+)=tab3.col
AND   tab3.col=tab4.price;

此查询仅返回表2中有条目的Sl的结果。如何解决此问题?

3 个答案:

答案 0 :(得分:1)

使用正确的ANSI左连接:

select tab1.Name,
        tab2.len,
        tab3.tax,
        tab4.org
From Table1  tab1  
     inner join Table3  tab3 on tab1.sl.tab3.col
     inner join Table4  tab4 on tab3.col=tab4.price
     left join Table2  tab2 on tab1.sl=tab2.index;

这使您的代码更具可读性。

答案 1 :(得分:0)

尝试以下---

select tab1.Name,
        tab2.len,
        tab3.tax,
        tab4.org
From 
   Table1  tab1 left join Table2  tab2  
on tab1.sl=tab2.index(+) join Table3  tab3 
on tab2.index(+)=tab3.col join Table4  tab4 
on tab3.col=tab4.price;

答案 2 :(得分:0)

看,你应该从20世纪90年代到21世纪初,通过重写你的查询而不使用“omega-join (+)语法”。

将欧米茄转换为join,您的查询就像这样。

SELECT tab1.Name,
       tab2.len,
       tab3.tax,
       tab4.org
  FROM Table1  tab1,
 left  join  Table2  tab2 ON tab1.sl=tab2.index
 right join  Table3  tab3 ON tab2.index=tab3.col 
 inner join  Table4  tab4 ON tab3.col=tab4.price;

然后,右,左和内连接操作的明显混乱组合暗示了解决问题的方法。

切换到所有左边连接,当Table1行与其他表格不匹配时,它们不会被取消。

      SELECT tab1.Name,
             tab2.len,
             tab3.tax,
             tab4.org
        FROM Table1 tab1
   LEFT JOIN Table2 tab2 ON tab1.sl=tab2.index
   LEFT JOIN Table3 tab3 ON tab2.index=tab3.col 
   LEFT JOIN Table4 tab4 ON tab3.col=tab4.price;

即使您必须使用旧的omega join语法,也应该以不会阻止来自Table1

的行的方式使用它
select tab1.Name,
        tab2.len,
        tab3.tax,
        tab4.org
From Table1  tab1,
     Table2  tab2, 
     Table3  tab3,   
     Table4  tab4
where tab1.sl=tab2.index(+)
AND   tab2.index=tab3.col(+)
AND   tab3.col=tab4.price(+);

(+)在右侧的位置意味着它是左连接,反之亦然。