我已经“继承”了一个超过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 - 但它似乎正在完成它的工作(并且已经过去几年......)有什么想法吗?指针?
答案 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
针对这些连接的结果发生。