2017-12-05 4 views
0

레거시 SQL 외부 조인을 ANSI로 변환해야합니다.레거시 SQL 외부 조인 변환 =, = *을 ANSI

선택 - :

그 존재의 이유, 우리는는 SQL 2016

기존 SQL 쿼리에 기존 DB 인스턴스 (? 5분의 2,000)에서 업그레이드하는

아니야 자,가요 데이터 선택해하기

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 자체와 행 수 측면에서 큰 불일치가 발생합니다. 내가 잘못

를하고있는 중이 야 무엇 :

내가 사용 쿼리이 무엇입니까?

모든 세 기존 조인에서 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 *의 측면 =. 그래서 그것은 세 개의 테이블 모두를 가지고 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

'tab1 LEFT JOIN tab2 ... WHERE tab2.columnY = ''tab2'의'WHERE' 절 조건이'NULL'과 관련된 것이 아니라면' LEFT JOIN'을 'INNER JOIN'으로 바꿨다. –

+0

@Damien_The_Unbeliever : 정교하게 주시겠습니까? 흥미로운 것 같지만, 무슨 뜻인지 알지 못합니다. –

+0

'WHERE' 절에'counterparty_alias' 조건이 있습니다. 이 조건은 'JOIN'이 성공한 경우에만 true가 될 수 있습니다. 따라서,'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

나는 데이터를 공유 할 수 없다고 확신한다. 테이블 정의를 공유 할 수 있는지 확인하고 다시 돌아 보겠습니다. –

관련 문제