在将网站从 oracle server 迁移到 sql server 时。我们坚持使用以下类型的查询。我们有几个这样的表和连接。例如,如下所示
Select *
from Job_master J,
Batch_master B
where J.BUS_DATE (+)= B.BUS_DATE
.除了将所有查询转换为使用右外连接或左外连接外,我们还有其他解决方案吗?
在将网站从 oracle server 迁移到 sql server 时。我们坚持使用以下类型的查询。我们有几个这样的表和连接。例如,如下所示
Select *
from Job_master J,
Batch_master B
where J.BUS_DATE (+)= B.BUS_DATE
.除了将所有查询转换为使用右外连接或左外连接外,我们还有其他解决方案吗?
对于右外连接
Select *
from Job_master J
Right Outer Join
Batch_master B
On J.BUS_DATE = B.BUS_DATE
对于左外连接
Select *
from Job_master J
Left Outer Join
Batch_master B
On J.BUS_DATE = B.BUS_DATE
对于内连接
Select *
from Job_master J
Inner Join
Batch_master B
On J.BUS_DATE = B.BUS_DATE
您可以使用与上述类似的命令
Select * from Job_master J right outer join Batch_master B
on J.BUS_DATE = B.BUS_DATE
只有在使用兼容级别 80 (SQL 2000) 时,才能编写非 ANSI 外连接。SQL Server 2008R2 中的相同语法是:
select *
from dbo.Address ad, dbo.Street st
where st.Id *= ad.StreetId
(将 (+) 转换为 *)
如果您在没有兼容级别 80 的数据库中运行它,那么您会收到一条很好的错误消息,表明这是不可能的:
消息 4147,级别 15,状态 1,第 4 行查询使用非 ANSI 外连接运算符(“ =”或“= ”)。要在不修改的情况下运行此查询,请使用 ALTER DATABASE 的 SET COMPATIBILITY_LEVEL 选项将当前数据库的兼容级别设置为 80。强烈建议使用 ANSI 外连接运算符(LEFT OUTER JOIN、RIGHT OUTER JOIN)重写查询。在 SQL Server 的未来版本中,即使在向后兼容模式下也不支持非 ANSI 连接运算符。
但是,虽然它可能是可行的,但根本不建议使用它(它是模棱两可且已弃用的)。请阅读评论中提到的另一个问题,耶利米对此有很好的回答。