使用 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)
就像我说的,它不是真正的 OUTER JOIN
,但如果你多玩它一些,也许你会得到你需要的东西。
祝你好运。
好的,感谢所有贡献者,我能够更彻底地思考这个问题。这让我得出了这个问题无解的结论。
由于交叉联接缺少外部联接可能具有的某些行,因此您不能通过使用 where 条件过滤掉行来从第一行到第二行。
感谢大家的支持!
我有一个有点奇怪的问题。为了让一些旧软件 运行 对抗较新版本的 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)
就像我说的,它不是真正的 OUTER JOIN
,但如果你多玩它一些,也许你会得到你需要的东西。
祝你好运。
好的,感谢所有贡献者,我能够更彻底地思考这个问题。这让我得出了这个问题无解的结论。
由于交叉联接缺少外部联接可能具有的某些行,因此您不能通过使用 where 条件过滤掉行来从第一行到第二行。
感谢大家的支持!