Par*_*tha 1 sql sql-server join
我有一个用SQL Server 2000版编写的SQL查询.该查询未在SQL Server 2016中运行.查询如下所示.
Select *
from ProjPace2 P, ProjPace2 P2
where P.DivCode *= P2.DivCode
and P.ProjGrp *= P2.ProjGrp
and P.ProjYr *= P2.ProjYr
and P.T_D *= P2.T_D
and P.Qtr *= P2.Qtr
and P.SRA_LRA *= P2.SRA_LRA
and P.District *= P2.District
and P.PICompany *= P2.PICompany
and P.ContCode *= P2.ContCode
and P.dtWkEnding > dateadd(dd,-1,'1/1/2015')
and P2.dtWkEnding between dateadd(dd,-10,'1/1/2015') and dateadd(dd,-3,'1/1/2015')
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
消息4147,级别15,状态1,行20
查询使用非ANSI外部联接运算符("*="或"=*").要在不进行修改的情况下运行此查询,请使用ALTER DATABASE的SET COMPATIBILITY_LEVEL选项将当前数据库的兼容级别设置为80.强烈建议使用ANSI外连接运算符(LEFT OUTER JOIN,RIGHT OUTER JOIN)重写查询.在SQL Server的未来版本中,即使在向后兼容模式下也不支持非ANSI连接运算符.
我可以理解由于"*"而发生的错误,我想用Left outer join替换它,所以我可以得到相同的结果.
谢天谢地,任何帮助都会被接受.
帕塔
使用*=operator denote ON子句为LEFT OUTER JOIN.So等效查询指定的所有条件将变为:
Select *
from ProjPace2 P
left outer join ProjPace2 P2 on
P.DivCode = P2.DivCode
and P.ProjGrp = P2.ProjGrp
and P.ProjYr = P2.ProjYr
and P.T_D = P2.T_D
and P.Qtr = P2.Qtr
and P.SRA_LRA = P2.SRA_LRA
and P.District = P2.District
and P.PICompany = P2.PICompany
and P.ContCode = P2.ContCode
where P.dtWkEnding > dateadd(dd,-1,'1/1/2015')
and P2.dtWkEnding between dateadd(dd,-10,'1/1/2015') and dateadd(dd,-3,'1/1/2015')
Run Code Online (Sandbox Code Playgroud)
但需要注意的一点是:由于您具有返回行必须具有的条件,P2.dtWkEnding between dateadd(dd,-10,'1/1/2015') and dateadd(dd,-3,'1/1/2015')因此不需要返回LEFT OUTER JOIN没有匹配P2记录的行.所以对于这个查询你应该使用INNER JOIN.