2011-01-26 49 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實現了自己的外連接語法。