2016-12-08 4 views
1

나는 함께 가입하고 누락 된 번역의 결과물을 생성하고자하는 세 개의 테이블을 가지고 있습니다.다중 조인 결과 세트

----------------------------- 
Table 1 - Languages 
-----------------------------  
LanguageID Name 

-----------------------------  
    Table 2 - Phrase 
-----------------------------  
PhraseID  Text 

----------------------------------------------------------  
        Table 3 - Transaltion 
----------------------------------------------------------  
TranslationID PhraseID LanguageID Text 

I 구문 당 모든 언어를 반환하는 SQL 쿼리를 만들려고하고 아래의 코드로 변환 여부가 있는지 보여왔다. 그러나 내가 원하는 것을 출력하지 않는 출력은 번역문에있는 레코드가있는 부분 만 표시합니다. 아래 코드는 내가 가지고 노는 코드입니다.

SELECT 
     P.PhraseID 
    ,L.LanguageID 
    ,T.TranslationID 
FROM 
    Phrase P 
    LEFT JOIN Translation T ON T.PhraseID = P.PhraseID 
    RIGHT OUTER JOIN [Language] L ON T.LanguageID = L.LanguageID OR L.LanguageID IS NULL 

아마도 뭔가 간단한 것이 누락되었습니다. 그러나 누군가가 올바른 방향으로 나를 가리킬 수 있기를 바랬습니다.

편집 :

Exepected 출력

---------------------------------------------------------- 
Phrase ID Language ID TranslationID 
---------------------------------------------------------- 
    1   1   1    
    1   2   NULL   <--- Missing translation 

해결책 :

SELECT 
    P.PhraseID, 
    L.LanguageID, 
    T.TranslationID 
FROM [Language] L 
    CROSS JOIN Phrase P 
    LEFT JOIN Translation T ON T.LanguageID = L.LanguageID AND T.PhraseID = P.PhraseID 
WHERE P.[Text] = 'Barcode' 
+1

무엇이 문제입니까? 샘플 데이터 및 예상 결과를 보여주십시오. [** How-to-Ask **] (http://stackoverflow.com/help/how-to-ask) \t \t 그리고 [** 시작 **] (http : //spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/) 질문 품질을 향상시키고 더 나은 답변을 얻는 방법을 배우십시오. –

+0

'T.PhraseID'가 null이고'L.LanguageID'가 NULL이 아닌 경우를 찾고 있습니다, 맞습니까? – FDavidov

+0

LEFT JOIN과 RIGHT JOIN을 혼동하지 마십시오. 너무 혼란 스럽습니다. ('LEFT JOIN'을 항상 고수하면,'메인 테이블은 옵션 데이터를 조인하는 메인 테이블 '대신에 메인 테이블 왼쪽 조인을 이해하는 것이 훨씬 쉬워 지므로) – jarlh

답변

2

여기에없는 번역을 얻을 수있는 한 가지 방법은 다음과 같습니다

이 작업을 수행하는 방법
select p.PhraseID, l.LanguageID 
from languages l cross join 
    phrases p left join 
    translations t 
    on t.LanguageID = l.LanguageID and t.PhraseID = p.PhraseId 
where t.LanguageId is null; 

? cross join은 모든 언어와 구문의 조합을 생성합니다. left join은 기존 번역과 일치하는 단어를 찾습니다. where은 경기를 필터링합니다. 빌라! 일치하지 않는 모든 것.

+0

''크로스 조인 '이 필요한 이유는 무엇입니까? '어디서'+'십자가 조인 '하면 쉽게 읽을 수있는'내부 '가됩니다 – a1ex07

+0

@ a1ex07 동일한 해결책을 생각했기 때문에 무슨 뜻인지 확실하지 않습니다. 어쩌면 다른 답변을 게시해야합니다. –

+0

@JuanCarlosOropeza : preference - 나는 'CROSS JOIN'을 피했다. 이 특별한 경우에는'CROSS JOIN language l' 대신'INNER JOIN languages ​​l ON 1 = 1'을 사용합니다. – a1ex07