2011-09-05 75 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发生反对这些联接的结果。