使用 WHERE 子句模拟 OUTER JOIN

Simulate OUTER JOIN with WHERE clause

我有一个有点奇怪的问题。为了让一些旧软件 运行 对抗较新版本的 MS SQL 服务器,我必须摆脱外部连接运算符“*=”和“=*” .不幸的是,我只能操作动态构建的 sql 查询的 where 子句。没有办法重新设计整个查询。因此我的问题是:

有没有办法在不使用外连接运算符的情况下通过 where 子句模拟外连接?

目标是将数据库从支持运算符的兼容级别 80(即“2000”)升级到不支持运算符的最新级别。

非常感谢。

真正的OUTER JOIN行为可能是不可能的。但是,根据你的现实生活要求,也许你可以使用这样的东西:

Declare @test1 table(ID int) 
Declare @test2 table(ID int) 

Insert @test1
Values(1)
,     (2)

Insert @test2
Values(1)
,     (3)

Select *
From  @test1 t1
,     @test2 t2
Where exists(select null 
             from  @test2 t3 
             where t3.ID = t1.ID  
                or t2.ID is null)

rextester demo

就像我说的,它不是真正的 OUTER JOIN,但如果你多玩它一些,也许你会得到你需要的东西。

祝你好运。

好的,感谢所有贡献者,我能够更彻底地思考这个问题。这让我得出了这个问题无解的结论。

由于交叉联接缺少外部联接可能具有的某些行,因此您不能通过使用 where 条件过滤掉行来从第一行到第二行。

感谢大家的支持!