2016-12-29 76 views
0
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 

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

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; 

此查询仅返回那些S1中针对其存在于表2项我怎样才能解决这个结果吗?

+3

mysql不支持(+)在我看来你使用的是oracle数据库 –

+3

请向我们展示你想要的输出。我不清楚你想要做什么。是的,“(+)”连接语法看起来像Oracle,你不应该使用它。 –

+0

如果你在'merge'语句中使用这个,那么请包含完整的语句。 – CGritton

回答

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; 
+0

其实我正在编写一个过程,这个select语句在Merge中。执行程序连接时内部合并将不起作用。 – Jhon

+0

这有点棘手 – meet

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; 

这使你的代码更易读。

+0

ANSI外部连接语法比旧的Oracle更清晰。 – APC

+0

其实我正在编写一个程序,这个select语句在Merge里面。执行程序连接时内部合并将不起作用。 – Jhon

+0

嗨Cgritton我需要帮助形成一个新的查询,如果可能的话,你可以帮助。我已经发布了这个问题फेवआवर्जago – Jhon

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; 

即使你必须使用旧的欧米茄连接语法,你应该将不会从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(+); 

抑制行的方式(+)的右侧的位置,意味着它的使用一个左连接,反之亦然。

+0

其实我正在编写一个过程,这个选择语句是在合并。执行程序连接时内部合并将不起作用。 – Jhon

+0

*当然* join操作在merge语句中工作。你只是没有正确的语法。无论如何,请参阅我的编辑。您的连接配置会抑制来自错误表的不匹配行。 –