Исходный код SQL-запроса - PullRequest
       7

Исходный код SQL-запроса

3 голосов
/ 26 января 2010

у меня 3 таблицы. На одном столе есть все люди, [Pat], каждый с уникальным [PatId]. Вторая таблица содержит всю информацию страховой компании, [Ins], каждая с уникальным [InsId]. Третья таблица содержит информацию о страховании пациента, [PatIns]. В таблице [PatIns] некоторые пациенты (также [PatId]) имеют вторичную или третью страховку, и она обозначена в [InsType] как 1, 2 или 3. Мне нужен SQL-запрос, который не только объединит 3 таблицы, но также вернуть данные, когда пациент имеет вторичную или третью страховку. Пока что у меня есть:

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 страховыми полисами. Я хотел бы вернуть всех пациентов и нулевые значения для таблиц INS2 и / или INS3, если у пациента есть только 1 страховка. есть идеи как это сделать?

Ответы [ 2 ]

2 голосов
/ 26 января 2010

Хотя это можно сделать в предложении 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 голосов
/ 26 января 2010

Используйте обозначение 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] 
;   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...