我需要将旧的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?
答案 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子句来进行比较来进行检查。
作为参考,我与这篇文章进行了交叉检查: