2010-12-13 38 views
1

问候,CASE表达式中的嵌套SELECT语句

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

我已经在这里发布了一个类似的问题。 Return multiple values in one column within a main query但我怀疑我缺乏SQL知识使问题太模糊,因为答案没有奏效。我正在使用Microsoft SQL 2005.
这是我的。

以CaseID作为PK,CaseID的多个表是唯一的。
一个包含CaseID和ItemNum(AutoInc)作为组合PK的表(tblKIN)。
因为数据库中的每个人都可能有多个亲戚。
如果我运行以下,在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结尾的括号内。
我试着添加一个BEGIN和END到CASE语句的THEN部分。
都没有工作。

源表数据看起来像这样。 (时期增加了可读性
tblCase
CaseID名称地址
10-001吉姆...... 100主街
10-002汤姆.... 150榆树街
10-003安倍..... 200一号圣

tblKIN
CaseID ItemNum名称关联地址
10-001 00001史蒂夫......儿子........ 100主街
10-002 00002 James..Father .... 150 Elm圣
10-002 00003贝蒂....侄女...... 150 Elm St.
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汤姆... 150榆树街..Father,侄女,妹妹,儿子

我相信这可能是一个简单的解决,但我只是不知道该怎么做。
谢谢你的时间,我对问题的长度表示歉意,但我想说清楚。

谢谢!

回答

0

当我做了类似的事情时,我不得不创建一个标量函数来完成返回varchar结果的合并。然后在select中调用它。

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 
+0

完美地工作!!!!!!谢谢 !!!!! – Scottster 2010-12-13 22:12:51

0

您可以创建一个FUNCTION,以caseID作为参考并返回truefalse

由于您多次调用嵌套查询,它的性能肯定会受到影响。更好的解决方案是执行查询并将结果存储在临时表中。 然后通过这个临时表和caseIDFUNCTION并检查收容。