CASE表达式中的嵌套SELECT语句

时间:2010-12-13 21:09:14

标签: select case coalesce

问候,

这是我的问题。
我需要从多行获取数据,并将它们作为单个结果返回给更大的查询。

我已经在这里发布了类似的问题。 Return multiple values in one column within a main query但我怀疑我缺乏SQL知识使问题过于模糊,因为答案不起作用 我使用的是Microsoft SQL 2005 这就是我所拥有的。

CaseID为PK的多个表,CaseID是唯一的 一个表(tblKIN),CaseID和ItemNum(AutoInc)作为组合PK 因为数据库中的每个人可能都有一个以上的亲戚 如果我运行以下命令,在SQL查询窗口中,它可以工作。

DECLARE @KINList varchar(1000)  
SELECT @KINList = coalesce(@KINList + ', ','') + KINRel from tblKIN  
WHERE CaseID = 'xxx' and Address = 'yyy'  
ORDER BY KINRel  
SELECT @KINList  

这将返回居住在同一地址的所有人的关系。结果看起来像这样......
父亲,侄女,姐姐,儿子

现在,我的问题是如何将其添加到我的主查询中? 缩短到相关信息,主要查询看起来像这样。

SELECT DISTINCT  
c.CaseID,  
c.Name,  
c.Address,  
Relatives=CASE WHEN exists(select k.CaseID from tblKIN k where c.CaseID = k.CaseID)  
   THEN DECLARE @KINList varchar(1000)  
        SELECT @KINList = coalesce(@KINList + ', ','') + KINRel from tblKIN  
        WHERE CaseID = 'xxx' and Address = 'yyy'  
        ORDER BY KINRel  
        SELECT @KINList  
   ELSE ''  
   END
FROM tblCase c  
ORDER BY c.CaseID

我收到的错误是。
服务器:消息156,级别15,状态1,行13 关键字'DECLARE'附近的语法不正确。
服务器:消息156,级别15,状态1,行18 关键字“ELSE”附近的语法不正确。

我尝试在DECLARE的括号内嵌套到SELECT @KINList的末尾 我尝试在CASE声明的THEN部分添加BEGIN和END 都没有奏效。

源表数据看起来像这样。 ( 为了便于阅读而添加了期间
tblCase
CaseID名称地址
10-001 Jim ...... 100 Main St. 10-002汤姆...... 150榆树 10-003 Abe ..... 200 1st St.

tblKIN
CaseID ItemNum名称关系地址
10-001 00001史蒂夫......儿子........ 100 Main St. 10-002 00002 James..Father .... 150 Elm St.
10-002 00003贝蒂......侄女...... 150榆树 10-002 00004 Greta ...姐姐..... 150 Elm St.
10-002 00005 Davey..Son ........ 150 Elm St.
10-003 00006 Edgar ...兄弟...... 200 1st St.

如果我运行CaseID = 10-002的查询,则需要返回以下内容 CaseID名称地址.......亲戚
10-002 Tom ... 150 Elm St. ..父亲,侄女,姐姐,儿子

我确信这可能是一个简单的修复,但我只是不知道该怎么做 谢谢你的时间,我为问题的长度道歉,但我想清楚。

谢谢!!!

2 个答案:

答案 0 :(得分:0)

您可以创建一个FUNCTION,其中caseID作为争论并返回truefalse

由于您多次调用嵌套查询,因此它肯定会受到性能影响。更好的解决方案是执行查询并将结果存储在临时表中。 然后将此临时表和caseID传递给FUNCTION并检查包含。

答案 1 :(得分:0)

当我做类似的事情时,我必须创建一个标量函数来执行返回varchar结果的coalesce。然后只需在选择中调用它。

CREATE FUNCTION GetRelatives 
(
    @CaseID varchar(10)
)
RETURNS varchar(1000)
AS
BEGIN

    DECLARE @KINList varchar(1000)  
    SELECT @KINList = coalesce(@KINList + ', ','') + KINRel from tblKIN  
        WHERE CaseID = @CaseID  
    ORDER BY KINRel  

    RETURN @KINList 

END

然后选择

SELECT DISTINCT  
c.CaseID,  
c.Name,  
c.Address,  
database.dbo.GetRelatives(c.CaseID) AS Relatives
FROM tblCase c  
ORDER BY c.CaseID