2011-08-25 62 views
6

我想轉換一個Informix查詢到Oracle:加入Oracle表中的(多個外連接)

的Informix的查詢看起來是這樣的:

SELECT 
    r.aa, n.bb, nd.cc,u.id, ud.dd, g.attr 
FROM 
    tab1 u, tab2 ud, 
OUTER (tab3 a, tab4 n, tab5 nd, tab6 r, OUTER (tab7 g, tab8 atr)) 
WHERE 
    r.xx = n.xx AND 
    n.nas = a.nas AND 
    a.user = u.user AND 
    a.ac = g.ac AND 
    n.nas1 = nd.nas1 AND 
    u.user1 = ud.user1 AND 
    atr.sso = g.sso AND 
    UPPER(atr.name) = 'NAME' AND 
    u.id = 102 

的Oracle查詢看起來是這樣的:

SELECT 
    r.aa, n.bb, nd.cc,u.id, ud.dd, g.attr 
FROM 
    tab1 u 
INNER JOIN tab2 ud ON 
    u.user1 = ud.user1 AND 
    u.id = 102 
LEFT OUTER JOIN tab3 a ON a.user = u.user 
LEFT OUTER JOIN tab4 n ON n.nas = a.nas 
LEFT OUTER JOIN tab5 nd ON n.nas1 = nd.nas1 
LEFT OUTER JOIN tab6 r ON r.xx = n.xx 

我不知道如何加入其他兩個表。

任何人都可以幫助我嗎?

+0

Informax語法的含義是什麼? –

+0

你有沒有試過[SQLine](http://www.sqlines.com/online)? –

回答

0

我會嘗試添加這些:

LEFT OUTER JOIN tab7 g ON a.ac = g.ac 
LEFT OUTER JOIN tab8 atr ON g.sso = atr.sso AND UPPER(atr.name) = 'NAME' 
+0

表格tab7和tab8是內部連接到對方;複合結果是外連接到其他表。 –

+0

'AND upper(atr.name)'會刪除連接的左外部特性。 – Ben

7

我相信,查詢應該是這個樣子:

SELECT r.aa, n.bb, nd.cc, u.id, ud.dd, g.attr 
    FROM   tab1 AS u 
     INNER JOIN tab2 AS v ON u.user1 = v.user1 AND u.id = 102 
    LEFT OUTER JOIN tab3 AS a ON a.user = u.user 
    LEFT OUTER JOIN tab4 AS n ON n.nas = a.nas 
    LEFT OUTER JOIN tab5 AS d ON n.nas1 = d.nas1 
    LEFT OUTER JOIN tab6 AS r ON r.xx = n.xx 
    LEFT OUTER JOIN (SELECT g.attr, g.ac 
        FROM tab7 AS x 
        JOIN tab8 AS atr ON x.sso = atr.sso 
        WHERE UPPER(atr.name) = 'NAME' 
       ) AS g ON a.ac = g.ac 

我改變了別名「第二」只是「d」和「UD」到'v',以便所有別名都是單個字母。 Informix表示法中的嵌套OUTER(tab7 g, tab8 atr)本身就是一個內部聯接(與我版本中的子選擇一樣),但該結果集與外部聯接的a.ac。這就是重寫所說的。

我在子查詢中使用了WHERE子句;如果你願意,WHERE條件可以留在ON子句中。優化器可能正確和等價處理的機會。同樣,內部聯接中的AND u.id = 102可以放置在WHERE子句中。同樣,優化器可能會推低過濾條件以獲得更好的性能。

請注意,子查詢中的UPPER功能可能需要進行表掃描 - 除非在UPPER(atr.name)上有功能索引。


重溫這個,查詢的初始部分的音譯不準確。

原始查詢包括FROM子句:

FROM tab1 u, tab2 ud, OUTER(tab3 a, tab4 n, tab5 nd, tab6 r, OUTER(tab7 g, tab8 atr)) 

的表格tab3tab4tab5tab6是內彼此接合,其結果是外連結到tab1tab2。同樣,tab8內部連接到tab7,但其結果是外部連接到表3-6的內部連接。我給原來的答案(基於問題的提綱答案)將在舊的Informix符號使用表示:

FROM tab1 u, tab2 ud, 
    OUTER(tab3 a, OUTER(tab4 n, OUTER(tab5 nd, OUTER(tab6 r, OUTER(tab7 g, tab8 atr))))) 

因此,它會更準確抄寫原始查詢爲:

SELECT r.aa, n.bb, nd.cc, u.id, ud.dd, g.attr 
    FROM tab1 AS u 
    JOIN tab2 AS v ON u.user1 = v.user1 AND u.id = 102 
    LEFT OUTER JOIN 
     (SELECT * 
      FROM tab3 AS a ON a.user = u.user 
      JOIN tab4 AS n ON n.nas = a.nas 
      JOIN tab5 AS d ON n.nas1 = d.nas1 
      JOIN tab6 AS r ON r.xx = n.xx 
      LEFT OUTER JOIN 
       (SELECT g.attr, g.ac 
       FROM tab7 AS x 
       JOIN tab8 AS atr ON x.sso = atr.sso 
       WHERE UPPER(atr.name) = 'NAME' 
       ) AS g ON a.ac = g.ac 
     ) AS loj 

剩餘的問題是確保正確的別名正在用於複雜的子查詢中的列。請注意,在沒有LEFT,RIGHT或FULL的情況下,JOIN被假定爲INNER加入;另外,如果指定了LEFT,RIGHT或FULL,OUTER是可選的。

需要注意的另一個細節:過濾條件下舊式Informix OUTER聯接的行爲與標準SQL OUTER聯接的行爲不同。這很少有所作爲,但偶爾也可能很重要。總體而言,標準SQL OUTER聯接的行爲通常更符合您的想法,但如果您運行迴歸測試並發現答案中存在差異,則可能是因爲舊式Informix OUTER聯接會以不同的方式做不同的事情來自新式Standard SQL OUTER連接。