2010-01-26 2 views
3

테이블이 3 개 있습니다. 한 테이블에는 모든 사람들이 있습니다. [Pat], 각각 고유 한 [PatId]이 있습니다. 두 번째 테이블에는 모든 보험 회사 정보 [Ins]이 있으며 각각 고유 한 [InsId]이 있습니다. 세 번째 테이블에는 환자 보험 정보 인 [PatIns]이 있습니다. [PatIns] 테이블에서 일부 환자 (또한 [PatId])는 2 차 또는 3 차 보험에 가입하고 [InsType]에 1, 2 또는 3으로 표시됩니다. 3 개의 테이블을 조인 할뿐만 아니라 환자에게는 2 차 또는 3 차 보험이 있습니다. 지금까지 나는 다음과 같은 것을 가지고있다 :SQL 쿼리 소스 코드

SELECT * 

FROM [XEREX_TEST].[dbo].[xrxPat], 

[XEREX_TEST].[dbo].[xrxIns], 

[XEREX_TEST].[dbo].[xrxPatIns] 

[XEREX_TEST].[dbo].[xrxPatIns] AS INS2, 

[XEREX_TEST].[dbo].[xrxPatIns] AS INS3 

WHERE [xrxPat].[PatId]=[xrxPatIns].[PatId] 

AND [xrxPatIns].[PatId] = INS2.[PatId] 

AND [xrxPatIns].[PatId] = INS3.[PatId] 

AND [xrxIns].[RecNo]=[xrxPatIns].[InsId] 

AND [xrxPatIns].[InsType]=1 

AND INS2.[InsType]=2 

AND INS3.[InsType]=3; 

문제는 3 가지 보험을 가진 환자 만 반환한다는 것이다. 환자가 보험이 1 개인 경우 INS2 및/또는 INS3 테이블에 대해 모든 환자와 널 값을 반환하고 싶습니다. 어떻게해야할까요?

답변

2

where 절에서이 작업을 수행 할 수 있지만 명시 적 조인을 사용하는 것이 가장 좋으며 코드를 읽기 쉽도록 만들면됩니다.

SELECT 
    * 
FROM [XEREX_TEST].[dbo].[xrxPat] 
INNER JOIN [XEREX_TEST].[dbo].[xrxIns] 
    ON [xrxPat].[PatId] = [xrxIns].[PatId] 
INNER JOIN [XEREX_TEST].[dbo].[xrxPatIns] 
    ON [xrxIns].[RecNo] = [xrxPatIns].[InsId] 
    AND [xrxPatIns].[InsType] = 1 
LEFT JOIN [XEREX_TEST].[dbo].[xrxPatIns] AS INS2 
    ON [xrxIns].[RecNo] = INS2.[PatId] 
    AND INS2.[InsType] = 2 
LEFT JOIN [XEREX_TEST].[dbo].[xrxPatIns] AS INS3 
    ON [xrxIns].[RecNo] = INS3.[PatId] 
    AND INS3.[InsType] = 3; 
+0

Doh! 너는 나를 때렸다! :) – David

+0

+1 : 나 자신에게 이것을 제안하려고했다. (라인 5에는 버그가 있음) – Joel

+0

은 고객이 1, 2 또는 3 정책을 가지고있는 모든 3 가지 경우를 올바르게 처리합니까? –

0

쉼표 대신 JOIN 표기법을 사용하십시오. 그런 다음 LEFT JOIN을 만듭니다.

SELECT * 
FROM 
(SELECT * FROM [XEREX_TEST].[dbo].[xrxPatIns] WHERE [InsType]=1) AS INS1 
LEFT JOIN 
(SELECT * FROM [XEREX_TEST].[dbo].[xrxPatIns] WHERE [InsType]=2) AS INS2 
ON INS1.[PatId] = INS2.[PatId] 
LEFT JOIN 
(SELECT * FROM [XEREX_TEST].[dbo].[xrxPatIns] WHERE [InsType]=3) AS INS3 
ON INS1.[PatId] = INS3.[PatId] 
JOIN 
[XEREX_TEST].[dbo].[xrxPat] 
ON [xrxPat].[PatId]=INS1.[PatId] 
JOIN 
[XEREX_TEST].[dbo].[xrxIns] 
ON [xrxIns].[RecNo]=INS1.[InsId] 
;   
+0

아 ... 내 아이폰에 코드를 쓰려고해서는 안된다. –