【发布时间】: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 t2 和 Table5 t5),它们旁边没有列出 JOIN 条件,以及视图定义末尾的两个额外 ON 条件 - 我似乎无法将其撕开并以“正确的” ANSI JOIN 语法将其重新组合在一起,以便我的行数相同......(我的原始视图让我得到了超过 12'000 行的内容,并且是第一个尝试重构此返回单行......)
有什么想法吗?这是什么鬼?对我来说,这似乎是完全无效的 SQL - 但它似乎正在完成它的工作(并且在过去几年中一直如此......)有什么想法吗?指针?
【问题讨论】:
-
我认为你的答案在this article中。
-
@Martin Smith:感谢您提供的信息量很大的链接!是的,确实——这里似乎就是这种情况。我从未见过这样做过——而且我确实有 10 年以上的 SQL Server 经验.... 哎呀!你每天都能学到一些东西!
-
不是我也不是。它可以与
OPTION (FORCE ORDER)一起使用来创建繁琐的计划,但到目前为止我还没有尝试过。
标签: sql-server-2005 sql-server-2000