【问题标题】:Weird SQL Server view definition奇怪的 SQL Server 视图定义
【发布时间】:2011-09-05 19:16:18
【问题描述】:

我“继承”了一个已有 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 - 但它似乎正在完成它的工作(并且在过去几年中一直如此......)有什么想法吗?指针?

【问题讨论】:

  • 我认为你的答案在this article中。
  • @Martin Smith:感谢您提供的信息量很大的链接!是的,确实——这里似乎就是这种情况。我从未见过这样做过——而且我确实有 10 年以上的 SQL Server 经验.... 哎呀!你每天都能学到一些东西!
  • 不是我也不是。它可以与OPTION (FORCE ORDER) 一起使用来创建繁琐的计划,但到目前为止我还没有尝试过。

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


【解决方案1】:
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 Querying 的第 7 章介绍了此语法,或参见 Itzik Ben Gan 的 this article 和 Lubor Kollar 的 follow up letter

例如,将t2.AddressOID = t4.OIDON 子句放在最后意味着t2JOIN 在逻辑上发生在最后。即首先处理其他联接逻辑然后LEFT JOIN针对这些联接的结果发生。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-11
    • 1970-01-01
    • 2013-06-26
    • 1970-01-01
    相关资源
    最近更新 更多