2010-01-26 6 views
3

J'ai 3 tables. Une table a tous les gens, [Pat], chacun avec un [PatId] unique. La deuxième table a toutes les informations de compagnie d'assurance, [Ins], chacune avec un [InsId] unique. La troisième table contient les informations d'assurance patient, [PatIns]. Dans la table [PatIns], certains patients (également [PatId]) ont une assurance secondaire ou une troisième et il est noté [InsType] comme 1, 2 ou 3. J'ai besoin d'une requête SQL qui rejoindra non seulement les 3 tables, mais aussi retournera les données lorsqu'une le patient a une assurance secondaire ou troisième. Jusqu'à présent j'ai:Code source SQL Query

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; 

Problème est que ne renvoie que les patients avec 3 assurances. Je voudrais retourner tous les patients et les valeurs nulles pour les tables INS2 et/ou INS3 si le patient n'a qu'une seule assurance. Une idée de comment faire cela?

Répondre

2

Bien que cela puisse être fait dans la clause where, il est préférable de passer à l'utilisation de jointures explicites, car cela facilite également la lecture du code.

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! Tu m'as battu! :) – David

+0

+1: Étais sur le point de suggérer cela moi-même. (ligne 5 a un bug) – Joel

+0

cela traitera-t-il correctement tous les 3 cas: le client a 1, 2, ou 3 politiques? –

0

Utilisez la notation JOIN au lieu de virgules. Puis faites les JOINs GAUCHE.

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

Ugh ... Je ne devrais pas essayer d'écrire du code sur mon iPhone. –