将旧的SQL外部JOIN * =,= *转换为ANSI

时间:2017-12-05 07:38:48

标签: sql sql-server join sql-server-2005 sql-server-2000

我需要将旧的SQL外部联接转换为ANSI。

原因是,我们是从旧数据库实例(2000/5?)升级到SQL 2016。

旧版SQL查询: -

选择

  

- 我要选择的数据 -

 FROM counterparty_alias ca1,  
  counterparty_alias ca2,  
  counterparty cp,  
  party p  
 WHERE cp.code *= ca1.counterparty_code AND
  ca1.alias = 'Party1' AND  
  cp.code *= ca2.counterparty_code AND  
  ca2.alias = 'Party2' AND
  cp.code *= p.child_code AND  
  cp.category in ('CAT1','CAT2')

此处,Party1和Party2是派对类型代码,CAT1和CAT2是类别代码。他们只是数据;我已经抽象了它,因为价值并不重要。

现在,当我尝试用LEFT OUTER JOIN替换* =时,无论是行数还是数据本身,我都会在数据上产生巨大的不匹配。

我正在使用的查询是:

我做错了什么?

选择

  

- 我要选择的数据 -

 FROM 
  counterparty cp  
  LEFT OUTER JOIN counterparty_alias ca1 ON cp.code = ca1.counterparty_code  
  LEFT OUTER JOIN counterparty_alias ca2 ON cp.code = ca2.counterparty_code      
  LEFT OUTER JOIN party p  ON  cp.code = p.child_code
 WHERE  
  ca1.alias = 'Party1' AND  
  ca2.alias = 'Party2' AND
  cp.category in ('CAT1','CAT2')

显然,在所有三个传统连接中,cp(交易对手)表位于* =的左侧。所以这应该转换为所有三个表的LEFT OUTER JOIN。但是,我的解决方案似乎没有起作用 我怎样才能解决这个问题 ?我在这里做错了什么?

非常感谢任何帮助。在此先感谢:)

修改

我还有另一个这样的查询:

选择

  

- 我要选择的数据 -

FROM dbo.deal d,  
 dbo.deal_ccy_option dvco,  
 dbo.deal_valuation dv,  
 dbo.strike_modifier sm  
WHERE d.deal_id = dvco.deal_id  
AND d.deal_id = dv.deal_id      
AND dvco.base + dvco.quoted *= sm.ccy_pair  
AND d.maturity_date *= sm.expiry_date  

在这种情况下,dvco和d表似乎都在同一个表sm上进行LEFT OUTER JOIN。我该如何处理? 也许加入同一个表并使用别名sm1和sm2? 或者我应该使用sm作为中心表并将连接更改为dvco和d表上的RIGHT OUTER JOIN?

2 个答案:

答案 0 :(得分:0)

我认为您的翻译问题在于您在where子句中使用条件而不是on子句中的条件。
当我试图翻译它时,这就是我得到的翻译:

FROM counterparty cp
LEFT JOIN counterparty_alias ca1 ON cp.code = ca1.counterparty_code 
                                AND ca1.alias = 'Party1'
LEFT JOIN counterparty_alias ca2 ON cp.code *= ca2.counterparty_code 
                                AND ca2.alias = 'Party2'
LEFT JOIN party p ON cp.code = p.child_code
WHERE cp.category in ('CAT1','CAT2')

但是,由于您没有提供样本数据,所需结果甚至是完整查询,因此很难确定我是否正确。

答案 1 :(得分:-1)

非常感谢您的帮助,对于后期的帖子也很抱歉,但是我使用SSMS内置的查询设计器工具来快速解决了这一问题。它只是重构了我所有的查询,并在Join本身上输入了正确的Join,Left或Right,以及Where条件作为AND条件,所以我得到了关于pre和post的正确数据结果集,只是有时是数据排序/排序有点差。 我迷失了截止日期,无法更早地更新解决方案。再次感谢您的帮助。希望这也会对其他人有帮助!

仍然有些不确定,如果连接条件相同并且过滤条件也相同,为什么排序/排序会稍微偏离一点,因为数据是100%匹配的。

  

要使查询Designer正常工作,只需选择您的旧版SQL,然后   通过按Ctrl + Shift + Q或转到主菜单打开查询设计器   工具栏=>查询=>编辑器中的设计查询。

就这样。这会将您的旧代码重构为新的ANSI标准。您将获得转换后的查询以及可以复制和测试的新联接。对我来说100%的时间都可以工作,除了在某些情况下排序不匹配之外,您可以通过在pre和post两者中添加一个简单的order by子句来进行比较来进行检查。

作为参考,我与这篇文章进行了交叉检查:

http://sqlblog.com/blogs/john_paul_cook/archive/2013/03/02/using-the-query-designer-to-convert-non-ansi-joins-to-ansi.aspx