У меня есть запрос, в котором используются два оператора SELECT
, объединенные с помощью оператора UNION ALL
. Оба оператора извлекают данные из похожих таблиц для заполнения результатов запроса. Я пытаюсь удалить «полудублирующиеся» строки из запроса, но у меня возникают проблемы с этим.
Мой запрос следующий:
SELECT DISTINCT *
FROM
(
SELECT
TeamNum = CASE
WHEN T.TeamName = 'Alpha Team'
THEN '1'
WHEN T.TeamName IN ('Bravo Team', 'Charlie Team')
THEN '2'
WHEN T.TeamName = 'Delta Team'
THEN '3'
ELSE '<Undefined>'
END,
P.PatientLastName AS LastName,
P.PatientFirstName AS FirstName,
R.PrimaryCity AS City,
ReimbursorName = CASE
WHEN RE.ReimbursorDescription = 'Medicare'
Then 'R1'
WHEN RE.ReimbursorDescription = 'Medicaid'
Then 'R2'
ELSE 'R3'
END,
P.PatientID AS PatientID
FROM
PatReferrals PR LEFT JOIN Patient P ON PR.PatientID = P.PatientID,
Patient P LEFT OUTER JOIN Rolodex R ON P.RolodexID = R.RolodexID,
PatReferrals PR LEFT OUTER JOIN PatReimbursors PRE ON PR.PatientID = PRE.PatientID,
PatReimbursors PRE LEFT OUTER JOIN Reimbursors RE ON PRE.ReimbursorID = RE.ReimbursorID,
PatReferrals PR FULL OUTER JOIN Teams T ON PR.TeamID = T.TeamID,
WHERE
PR.ReferralDate BETWEEN GETDATE()-4 AND GETDATE()-1
AND PR.Status <> 'R'
AND PRE.CoveragePriority = '1'
AND PRE.ExpirationDate IS NULL
UNION ALL
SELECT
TeamNum = CASE
WHEN T.TeamName = 'Alpha Team'
THEN '1'
WHEN T.TeamName IN ('Bravo Team', 'Charlie Team')
THEN '2'
WHEN T.TeamName = 'Delta Team'
THEN '3'
ELSE '<Undefined>'
END,
P.PatientLastName AS LastName,
P.PatientFirstName AS FirstName,
R.PrimaryCity AS City,
ReimbursorName = CASE
WHEN RE.ReimbursorDescription = 'Medicare'
Then 'E1'
WHEN RE.ReimbursorDescription = 'Medicaid'
Then 'E2'
ELSE 'E3'
END,
P.PatientID AS PatientID
FROM
PatReferrals PR LEFT JOIN Patient P ON PR.PatientID = P.PatientID,
Patient P LEFT OUTER JOIN Rolodex R ON P.RolodexID = R.RolodexID,
PatReferrals PR LEFT OUTER JOIN PatEligibilities PE ON PR.PatientID = PE.PatientID,
PatEligibilities PE LEFT OUTER JOIN Reimbursors RE ON PE.ReimbursorID = RE.ReimbursorID,
PatReferrals PR FULL OUTER JOIN Teams T ON PR.TeamID = T.TeamID,
WHERE
PR.ReferralDate BETWEEN GETDATE()-4 AND GETDATE()-1
AND PR.Status <> 'R'
AND PE.Status <> 'V'
AND PE.ApplicationDate BETWEEN DATE(PR.ReferralDate)-5 AND DATE('2100/01/01')
)
AS DUMMYTBL
ORDER BY
DUMMYTBL.LastName ASC,
DUMMYTBL.FirstName ASC
Результаты, которые я получаю при выполнении запроса, следующие:
3 Doe Jane Town R1 19874
1 Roe John City R3 50016
1 Roe John City E1 50016
2 Smith Jane Town E3 33975
Данные, которые мне нужно удалить, представляют собой повторяющиеся строки на основе определенных критериев после того, как результаты будут получены из исходного запроса. Каждый человек может быть указан только один раз, и у него должен быть один источник оплаты (R1, R2, R3, E1, E2, E3). Если есть R#, то для этого человека не может быть указано E#. Если нет R#, то должен быть указан E#. Как показано в моем примере, в строках 2 и 3 указан один и тот же человек, но два источника оплаты (R3 и E1).
Как я могу сделать так, чтобы у каждого человека отображалась только одна строка, используя критерии, которые я перечислил?
EDIT: изменен запрос SQL, чтобы показать исходные переменные из предложений WHERE
, чтобы показать дополнительные сведения о запросе. Таблицы PatReimbursors и PatEligibilities содержат схожие данные, но используются разные критерии для извлечения правильных данных.
TeamNum = T.TeamName,
? Это опечатка? - person Rachcha   schedule 21.03.2013from
, по-видимому, имеют несколько вхождений одних и тех же псевдонимов - похоже, что это никогда не может быть запущено. Кроме того, если имеется несколько источников «R», какой из них имеет приоритет? - person   schedule 21.03.2013CASE
для возврата чисел изTeamName
. @Mark Bannister - Да, этот запрос действительно работает. - person Mr Xaero   schedule 21.03.2013