"*"在SQL Server 2016中不起作用

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替换它,所以我可以得到相同的结果.

谢天谢地,任何帮助都会被接受.

帕塔

nej*_*jcs 7

使用*=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.