2017-12-05 29 views
0

に変換する従来のSQL外部結合をANSIに変換する必要があります。レガシーSQL外部JOIN * =、= *をANSI

そのビーイングの理由は、我々は、SQL 2016

レガシーSQLクエリにレガシーDBインスタンス(?5分の2000)からアップグレードしている: -

を選択

--MyデータSelect--する

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に置き換えようとすると、Dataの行数とデータそのものの両方で、Dataに大きな不一致が生じます。

私が使用しているクエリはこれです:私は間違っ

何をしているのですか?

すべての3つの従来の結合で、CP(相手方)の表は、左手にあり、明らかに

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') 

をSelect--する

--Myデータを選択* =の側。そのため、3つのテーブルすべてでLEFT OUTER JOINに変換する必要があります。しかし、私の解決策は動作していないようです。 どうすればこの問題を解決できますか?私はここで間違って何をしていますか?

ご協力いただければ幸いです。

をSelect--する

--Myデータを選択:事前のおかげ:)

EDIT

に私はまた、このような別のクエリを持っています

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

'tab1 LEFT JOIN tab2 ... WHERE tab2.columnY = ' 'tab2'の' WHERE'句の条件が 'NULL'sに関係するものではない場合、あなたは効果的に' 「LEFT JOIN」を「INNER JOIN」に変換する。 –

+0

@Damien_The_Unbeliever:詳しく教えてもらえますか?面白そうだが、私はあなたが意味するものを得ていない。 –

+0

あなたは 'WHERE'節に' counterparty_alias'という条件を設定しています。その条件は、 'JOIN'が成功した場合にのみ真となります。したがって、あなたがLEFT JOINを書いているにもかかわらず、あなたが実際に達成していることは、あなたが「INNER JOIN」と書いたのと同じです。あなたの質問はそれを編集して*サンプルデータ*と*期待される結果*を追加することで目覚ましい改善が見られます。さもなければ、人々は推測するでしょう。また、現在の問題を*特性化しようとしてください - それはあまりにも多くの行を返すか、少なすぎますか?余分な/欠けている行は、他の行とは違うものを共通にしていますか? –

答えて

0

翻訳の問題は、on節の代わりにwhere節の条件を使用していることです。
私はそれを翻訳してみました が、これは私が持っている訳です。しかし

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') 

、それはあなたも望ましい結果をサンプルデータを提供し、またはなかったので、私は正しいですかどうかを知るのは難しいです完全なクエリ

+0

助けてくれてありがとう、私はこれを試みたが、データはまだ一致していません。結果は確かにPREに近いものになります。おそらく、もうちょっと微調整してみる必要があります –

+0

質問を編集してDDL + DMLと有効なSQL文としてサンプルデータを組み込み、希望の結果を表示すると、助けがさらに簡単になります。 –

+0

私はデータを共有できないと確信しています。私がテーブル定義を共有することができるかどうかをチェックして戻ってみましょう。 –