2011-09-05 50 views
3

我已經「繼承了」一個超過10年曆史的應用程序,並且它確實有時顯示其年齡。我今天偶然發現了一個非常奇怪的視圖定義 - 我似乎無法理解它!你可以幫我嗎?這是最初在SQL Server 7.0上,並已被遷移到SQL Server 2005 - 但顯然它從來沒有被重構/重做....奇怪的SQL Server視圖定義

這是視圖定義 - 基於一堆表和另一個視圖:

CREATE VIEW dbo.MyOddView 
AS 
SELECT  
    t1.MVOID, t1.SomeOtherColumn, 
    t2.Number , 
    t3.OID, t3.FKOID, 
    t4.AcctNo, 
    t5.ShortDesc, t5.ZipCode, t5.City, 
    t6.BankAcctNo 
FROM 
    dbo.viewFirst vf 
INNER JOIN 
    dbo.Table1 t1 ON vf.MVOID = t1.MVOID AND vf.ValidFrom = t1.ValidFrom 
LEFT OUTER JOIN 
    dbo.Table2 t2 
RIGHT OUTER JOIN 
    dbo.Table3 t3 ON t2.OID = t3.FKOID 
LEFT OUTER JOIN 
    dbo.Table4 t4 ON t3.ZVOID = t4.OID 
LEFT OUTER JOIN 
    dbo.Table5 t5 
INNER JOIN 
    dbo.Table4 t6 ON t5.OID = t6.BCOID 
    ON t4.ZVOID = t5.OID 
    ON t2.AddressOID = t4.OID 
GO 

什麼我不明白是兩個在視圖定義的末尾加入哪個沒有連接條件旁列出他們的(對於Table2 t2Table5 t5),以及兩個額外的ON條件 - 我不能似乎撕裂了這個分開,並把它放回到合適的ANSI JOIN語法中,這樣我的行數就是一樣的......(我的原始視圖使我獲得了超過12000行的行數,並且第一次嘗試a t重構這個返回單行......)

任何想法?這是什麼?看起來像完全無效的SQL對我來說 - 但它似乎在做它的工作(並且一直在過去幾年....)任何想法?指針?

+1

我認爲你的答案在[本文](http://www.sqlmag.com/article/tsql3/take-control-of-joins)中有介紹。 –

+0

@Martin Smith:感謝您提供的信息豐富的鏈接!是的,確實如此 - 這似乎就是這種情況。我從來沒有見過這樣做 - 我有10多年的SQL Server暴露.... sheesh!你每天都會學到一些東西! –

+1

不,也不是我。它可以與'OPTION(FORCE ORDER)'一起使用來創建濃密的計劃,但不是我到目前爲止嘗試過的東西。 –

回答

3
SELECT ... 
FROM dbo.viewFirst vf 
     INNER JOIN dbo.Table1 t1 
     ON vf.MVOID = t1.MVOID 
      AND vf.ValidFrom = t1.ValidFrom 
     LEFT OUTER JOIN dbo.Table2 t2 
         RIGHT OUTER JOIN dbo.Table3 t3 
         ON t2.OID = t3.FKOID 
         LEFT OUTER JOIN dbo.Table4 t4 
         ON t3.ZVOID = t4.OID 
         LEFT OUTER JOIN dbo.Table5 t5 
             INNER JOIN dbo.Table4 t6 
             ON t5.OID = t6.BCOID 
         ON t4.ZVOID = t5.OID 
     ON t2.AddressOID = t4.OID 

這句法是覆蓋在裏面SQL Server 2008的T-SQL查詢第7章或看到this article通過伊茨克奔甘和follow up letter由Lubor科拉爾

具有t2.AddressOID = t4.OID最後例如手段ON條款邏輯上發生的最後是JOINt2。即其他連接是邏輯上先處理然後LEFT JOIN發生反對這些聯接的結果。