2011-01-26 60 views
0

我有一个这样的SQL:SQL表连接:有效的语法

select q1.*,q2* from (select * from t1,t2,t3 where t1.col1=t2.col1 and t2.col2=t3.col2) q1, (select * from p1,p2,p3 where p1.col1=p2.col1 and p2.col2=p3.col2) q2 where q1.col1 = q2.col1; 

假设col1col2col3都是独一无二的(即没有命名冲突)和wildcards通过适当的山坳名称替换...是这是写这个查询的正确方法?
阅读起来非常复杂。
如何提高效率?
此外,当我们做一个outer join,语法'left join't1.col1 = t2col1(+)在所有意义上都相当于?

如果需要更多信息,请让我知道。

回答

1

首先,我将放弃通过逗号分隔列表(例如t1,t2,t3)创建交叉连接的习惯。相反,您应该拥抱ANSI Join语法。其次,您可以将两个派生表合并成一个查询。第三,我建议明确声明你想要的列而不是使用Select *(在下面的例子中,我只是使用省略号来表示你需要填写你想要的列名)。最后,我不会使用任何种类的+语法来表示左连接。相反,使用左连接语法

Select ... 
From T1 
    Join T2 
     On T2.Col1 = T1.Col1 
    Join T3 
     On T3.Col2 = T2.Col2 
    Join P1 
     On P1.Col1 = T1.Col1 
    Join P2 
     On P2.Col1 = P1.Col1 
    Join P3 
     On P3.Col2 = P2.Col2 
    Left Join X1 
     On X1.Col1 = T1.Col1 
1

“适当”在某种程度上是在旁观者的眼中。我可能会尝试从子查询创建视图,并加入视图。

此外,当我们做外连接时,都将 语法“左连接”和t1.col1 = t2col1(+)等效于所有的感官?

我确定这是意图。我知道在最早的支持ANSI连接语法的Oracle版本中没有发生这种情况。但我不记得细节。

除了Oracle商店外,您必须使用ANSI语法,而且您也必须在很多Oracle商店中使用它。

我认为评估顺序可能会导致不同的结果。这基本上是因为在ANSI定义外连接应该如何工作之前,Oracle实现了自己的外连接语法。