我相信,查詢應該是這個樣子:
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))
的表格tab3
,tab4
,tab5
和tab6
是內彼此接合,其結果是外連結到tab1
和tab2
。同樣,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連接。
Informax語法的含義是什麼? –
你有沒有試過[SQLine](http://www.sqlines.com/online)? –