Странное определение SQL Server view - PullRequest
3 голосов
/ 05 сентября 2011

Я «унаследовал» более 10-летнее приложение, и оно иногда показывает его возраст. Сегодня я наткнулся на действительно странное определение представления - я просто не могу понять это! Вы можете мне помочь? Первоначально он был на SQL Server 7.0 и с тех пор был перенесен на SQL Server 2005 - но, очевидно, он никогда не подвергался рефакторингу / переделке ....

Это определение представления - на основе набора таблиц и другого представления:

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

То, что я не получаю, это два JOIN (для Table2 t2 и Table5 t5), у которых нет перечисленных ниже условий JOIN, и два дополнительных условия ON в конце определения представления - I кажется, не могу разорвать это на части и соединить обратно в «правильный» синтаксис ANSI JOIN, чтобы мое число строк было одинаковым ...... (мое исходное представление дает мне что-то более 12 000 строк, и первое попытка рефакторинга вернула одну строку ......)

Есть идеи? Что, черт возьми это? Мне кажется, что это совершенно недопустимый SQL - но он, кажется, выполняет свою работу (и это было в течение последних нескольких лет ...). Есть мысли? Указатели

1 Ответ

3 голосов
/ 06 сентября 2011
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  

Этот синтаксис описан в главе 7 Внутренних запросов к T-SQL в SQL Server 2008 или см. эту статью Ицик Бен Ган и последующее письмо Любор Коллар

Наличие предложения ON для t2.AddressOID = t4.OID last, например, означает, что JOIN из t2 логически происходит последним. то есть другие соединения логически обрабатываются в первую очередь, затем LEFT JOIN происходит против результата этих объединений.

...