我已经“继承了”一个超过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 t2
和Table5 t5
),以及两个额外的ON
条件 - 我不能似乎撕裂了这个分开,并把它放回到合适的ANSI JOIN语法中,这样我的行数就是一样的......(我的原始视图使我获得了超过12000行的行数,并且第一次尝试a t重构这个返回单行......)
任何想法?这是什么?看起来像完全无效的SQL对我来说 - 但它似乎在做它的工作(并且一直在过去几年....)任何想法?指针?
我认为你的答案在[本文](http://www.sqlmag.com/article/tsql3/take-control-of-joins)中有介绍。 –
@Martin Smith:感谢您提供的信息丰富的链接!是的,确实如此 - 这似乎就是这种情况。我从来没有见过这样做 - 我有10多年的SQL Server暴露.... sheesh!你每天都会学到一些东西! –
不,也不是我。它可以与'OPTION(FORCE ORDER)'一起使用来创建浓密的计划,但不是我到目前为止尝试过的东西。 –