1

问候,

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

我已经在这里发布了一个类似的问题。 在主查询的一列中返回多个值,但我怀疑我缺乏 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 的末尾。
我尝试将 BEGIN 和 END 添加到 CASE 语句的 THEN 部分。
都没有奏效。

源表数据看起来像这样。(为便于阅读添加句号
tblCase
CaseID 名称 地址
10-001 Jim......100 Main St.
10-002 Tom....150 Elm St.
10-003 Abe.....200 1st St.

tblKIN
CaseID ItemNum Name Relation Address
10-001 00001 Steve...Son........100 Main St.
10-002 00002 James..Father..150 Elm St.
10-002 00003 Betty.. ..侄女......150 Elm St.
10-002 00004 Greta...Sister.....150 Elm St.
10-002 00005 Davey..Son........150 Elm St .
10-003 00006 Edgar...Brother...200 1st St.

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

我确信这可能是一个简单的修复,但我只是不知道该怎么做。
感谢您抽出宝贵时间,对于问题的长度,我深表歉意,但我想澄清一下。

谢谢 !!!

4

2 回答 2

0

您可以创建一个FUNCTIONcaseID为参数并返回的truefalse

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

于 2010-12-13T21:18:07.750 回答
0

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

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
于 2010-12-13T21:22:40.147 回答