2011-06-15 99 views
1

我有一個看起來像這樣的一般查詢:基於外部查詢SQL子查詢選擇表

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 

的問題是這樣的:

「類型」一欄,我是選擇是一個整數 - 1-4型。

在子查詢中,查看我現在從表CertSpecialty查詢的位置。

我真正需要做的是,如果類型字段返回爲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

使用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) 
+0

好的,那段代碼對我來說很合理。然而,我在哪裏把它與外部查詢相關? – 2011-06-15 17:12:19

+0

想通了。我學到了一些新東西。非常感謝您的幫助。 – 2011-06-15 17:42:17