2011-06-15 89 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