奇怪的SQL Server视图定义

时间:2011-09-05 19:16:18

标签: sql-server-2005 sql-server-2000

我已经“继承”了一个超过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 t2Table5 t5),它们旁边没有列出JOIN条件,最后还有两个ON条件视图定义 - 我似乎无法将它拆开并以“正确的”ANSI JOIN语法将其重新组合在一起,以便我的行数相同......(我的原始视图让我得到了超过12的东西' 000行,并且第一次尝试重构这个行返回了一行......)

有什么想法吗?这到底是什么?对我来说似乎完全无效的SQL - 但它似乎正在完成它的工作(并且已经过去几年......)有什么想法吗?指针?

1 个答案:

答案 0 :(得分: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  

此语法在Inside SQL Server 2008 T-SQL查询的第7章中介绍,或者参见Itzik Ben Gan的this article和Lubor Kollar的follow up letter

最后为ON设置t2.AddressOID = t4.OID子句意味着JOIN t2逻辑上最后发生。其他连接首先是逻辑处理,然后LEFT JOIN针对这些连接的结果发生。