【问题标题】:What is the 'old style' syntax for joins in T-Sql?T-Sql 中连接的“旧式”语法是什么?
【发布时间】:2015-07-21 09:03:25
【问题描述】:

我正在针对新的(-er)Sql Server 2008 环境重写一堆旧的、写得不好的 Oracle 查询。他们使用老式的 Oracle 连接语法,如

select <whatever>
from Table1, Table2, Table3
where Table1.T1ID = Table2.T2ID      -- old Oracle inner join
and   Table2.T3ID = Table3.T3ID (+)  -- old Oracle left join (I think)

除了复杂得多。有很多混合连接和大量嵌套,以及大量视图堆积在这些事物中的视图上。这不漂亮。两台服务器之间的数据也是不同的,这让测试变得很麻烦。

我认为最简单的复制方法是使查询在 Sql Server 中看起来尽可能相似(即,使用相同的连接样式),然后在我确信之后进行大规模的清理工作他们肯定都在做同样的事情,而且我没有在错误的地方加入(是的,我暂时设置了兼容模式以支持旧加入)。

我知道 T-Sql 中内部连接的“旧”语法是

select <whatever>
from T1, T2
where T1.ID = T2.ID

但是左外连接或右外连接的“旧”语法是什么?

【问题讨论】:

  • 值得注意的是,非 ANSI 外连接运算符(*==*)自 SQL Server 2005 以来已被弃用,如果您想在 SQL Server 2008 中使用这些,您将需要将数据库的兼容级别设置为 80。这可能会导致许多其他进程失败,您可能需要硬着头皮立即使用 ANSI92 连接语法重写。
  • 我知道 - 在问题中:(and yes, I have compatibility mode temporarily set to support old joins). :)

标签: sql-server sql-server-2008 join legacy-code


【解决方案1】:

根据TechNet 上的文档(在 SQL Server 2000 上,因此请注意这可能不再受支持!),您需要使用 *= 而不是 Oracle 所做的 (+)

select <whatever>
from T1, T2
where T1.ID *= T2.ID

【讨论】:

  • @OzrenTkalcecKrznaric:谢谢。我认为你应该避免使用它。你为什么想要?在我的回答中添加了通知。
  • 我也会避免它;但是,我会使用与 OP(2 遍)相同的代码重写策略,以避免通过更改选择行为来破坏代码。如果我必须重写 2-3 个查询,我可以抓住机会,但如果是 200-300 个查询...:/
  • 是的。它根本不打算长期保存。一旦我确信连接正在做同样的事情,我就会将所有代码重写为更明智的东西。我暂时设置了兼容模式。
猜你喜欢
  • 2016-03-02
  • 2011-07-15
  • 2010-09-12
  • 2015-09-03
  • 1970-01-01
  • 2016-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多