Таблица выбора подзапроса SQL на основе внешнего запроса - PullRequest
1 голос
/ 15 июня 2011

У меня есть общий запрос, который выглядит так:

SELECT DISTINCT pb.id, pb.last, pb.first, pb.middle, pb.sex, pb.phone, pb.type, 
specialties = substring(
    SELECT ('|' + cs.specialty )
    FROM CertSpecialty AS cs 
    INNER JOIN CertSpecialtyIndex AS csi on cs.specialty = csi.specialty
    WHERE cs.id = pb.id
    ORDER BY cs.sequence_no
    FOR XML path(''),2,500)
FROM table AS pb 
WHERE etc etc etc

Проблема заключается в следующем:

Выбираемый мной столбец "type" является целым числом - типы 1-4.

В подзапросе посмотрите, куда я запрашиваю, из таблицы CertSpecialty прямо сейчас.

Что мне действительно нужно сделать, так это, если поле type возвращается как 1 или 3, это таблица, которую мне нужно запросить. Но если результатом строки является тип 2 или 4 (т. Е. ELSE), мне нужно запросить тот же столбец в таблице CertSpecialtyOther.

Так что это должно выглядеть примерно так (хотя этот obv не работает):

SELECT DISTINCT pb.id, pb.last, pb.first, pb.middle, pb.sex, pb.phone, pb.type, 
specialties = 
IF type in (1,3)

    substring((SELECT ('|' + cs.specialty )
    FROM CertSpecialty AS cs 
    INNER JOIN CertSpecialtyIndex AS csi on cs.specialty = csi.specialty
    WHERE cs.id = pb.id
    ORDER BY cs.sequence_no
    FOR XML path(''),2,500)

ELSE

    substring((SELECT ('|' + cs.specialty )
    FROM CertSpecialtyOther AS cs 
    INNER JOIN CertSpecialtyIndex AS csi on cs.specialty = csi.specialty
    WHERE cs.id = pb.id
    ORDER BY cs.sequence_no
    FOR XML path(''),2,500)    

end
FROM table AS pb
WHERE etc etc etc

Возможно ли это? Если так, какой правильный синтаксис? Есть ли более простой способ написать это, когда я переключаю таблицу, к которой я обращаюсь, не дублируя подзапрос?

Кроме того, у кого-нибудь есть хороший ресурс, который он мог бы связать со мной для такого рода вещей, чтобы узнать больше помимо этого?

Заранее спасибо.

1 Ответ

1 голос
/ 15 июня 2011

Используйте CTE.

;WITH cs AS
(
    SELECT 'A' SpecialtyCategory, phy_key, specialty
    FROM CertSpecialty

    UNION ALL

    SELECT 'B' SpecialtyCategory, phy_key, specialty
    FROM CertSpecialtyOther
)
SELECT csi.id, cs.specialty
FROM cs 
INNER JOIN CertSpecialtyIndex AS csi on cs.specialty = csi.specialty
WHERE cs.phy_key = pb.phy_key
AND cs.SpecialtyCategory = (CASE WHEN type in (1,3) THEN 'A' ELSE 'B' END)
...