【问题标题】:Simulate OUTER JOIN with WHERE clause使用 WHERE 子句模拟 OUTER JOIN
【发布时间】:2020-03-09 14:41:11
【问题描述】:

我有一个有点奇怪的问题。为了让一些旧软件在较新版本的 MS SQL Server 上运行,我必须去掉外连接运算符“*=”和“=*”。不幸的是,我只能操纵否则动态构建的 sql 查询的 where 子句。没有办法从整体上重新设计查询。因此我的问题是:

有没有办法通过 where 子句模拟外连接而不使用外连接操作符?

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

非常感谢。

【问题讨论】:

  • 您需要展示一个示例。我很确定答案通常是否定的,但也许在某些特定情况下。
  • 我担心答案可能是否定的:-/ 后台的机制是一个自定义的 O/R 映射器,它使用 C# 类的属性上的属性来生成使用外连接运算符的连接。因此没有具体案例。
  • 软件是自动插入WHERE关键字还是你可以控制?如果是这样,那么您可能可以先插入 OUTER JOIN 语法,如果不是,那么我认为您不走运,抱歉。
  • 左连接是相应内连接的 UNION ALL,其中不匹配的内连接行由空值扩展。因此,您不能使用 WHERE 从内部提取左侧。但是,您可以通过一行null交叉连接原始2个表,或者将空行添加到右侧表,然后在何处恰当地选择。但目前尚不清楚允许进行哪些转换或为什么进行转换。如果您能清楚而完整地描述您可以和不能对 * 查询范围进行哪些转换,这将有所帮助。是什么阻止您将整个查询(SQL 或 ORM)转换为使用关键字连接?

标签: sql sql-server outer-join


【解决方案1】:

真正的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,但也许如果你多玩一点,你会得到你需要的。

祝你好运。

【讨论】:

    【解决方案2】:

    好的,感谢所有贡献者,我能够更彻底地考虑这个问题。这让我得出结论,这个问题没有解决办法。

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

    感谢大家的支持!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-30
      • 2010-11-26
      • 1970-01-01
      • 2017-12-05
      • 2016-11-06
      • 2012-02-27
      • 2017-01-16
      相关资源
      最近更新 更多