Tsql T-SQL查询,将多行中的列合并到单个列中

Tsql T-SQL查询,将多行中的列合并到单个列中,tsql,Tsql,我已经看到了一些我正在尝试使用COALESCE和FOR XML(似乎是更好的解决方案)的例子。我只是不太懂语法 以下是我所拥有的(我将把字段缩短为仅关键字段): 我需要一个查询,该查询将列出每行一个请购单及其关联的作业和IssuedPOs。(申请编号以“R-”开头,工作编号以“J-”开头) 例如: R-123 |“PO1;PO2;PO3”|“J-12345;J-6780” 当然,亚当 这是一个返回多行的查询。我必须使用外部联接,因为并非所有请购单都有分配给作业和/或IssuedPOs的请购项(在

我已经看到了一些我正在尝试使用COALESCE和FOR XML(似乎是更好的解决方案)的例子。我只是不太懂语法

以下是我所拥有的(我将把字段缩短为仅关键字段):

我需要一个查询,该查询将列出每行一个请购单及其关联的作业和IssuedPOs。(申请编号以“R-”开头,工作编号以“J-”开头)

例如:

R-123 |“PO1;PO2;PO3”|“J-12345;J-6780”

当然,亚当

这是一个返回多行的查询。我必须使用外部联接,因为并非所有请购单都有分配给作业和/或IssuedPOs的请购项(在这种情况下,它们的fkey ID当然是空的)


这里有一种使用子查询的方法:

select  'R-' + cast(r.number as varchar(32)) as RequisitionNumber
,       (
        select  'PO' + CAST(ip.number as varchar(32)) + ';'
        from    IssuedPO ip
        join    RequisitionItems ri
        on      ip.id = ri.IssuedPOID
        where   ri.RequisitionID = r.id
        for xml path('')
        ) as POList
,       (
        select  'J-' + CAST(j.number as varchar(32)) + ';'
        from    Job j
        join    Job_Activity ja
        on      j.id = ja.JobID
        join    RequisitionItems ri
        on      ri.Job_ActivityID = ja.id
        where   ri.RequisitionID = r.id
        for xml path('')
        ) as JobList
from    Requisition r

查询并不是做这些事情的最佳场所:您想要的是违背SQL的关系性质。您可以在应用程序代码或Transact-SQL存储过程代码中进行分组。@9000虽然我同意在SQL中进行分组并不理想,但我看不出在存储过程中进行分组会有什么“更好”的效果(这将是相同的查询语法,除非您改为在临时表或内存表中进行分组)@adam robinson:在TSQL中,光标循环和可变变量有助于将多行组合成一个字符串。您可以创建一个函数来执行整个细节查询,并将其打包成字符串,然后在主查询中使用它。@9000:我想说的是,在这里使用存储过程没有什么比在单个查询中使用存储过程更好的了。在任何情况下,对于他正在寻找的字符串连接,使用
for XML
通常更好(并且不需要任何实际的过程代码),即使这有点难以理解。您的申请和作业之间的关系对我来说并不明显。也许您应该发布一个示例查询,在单个行中为您提供所需的数据,然后有人可以为您提供基于
FOR XML
的查询,以连接值并将结果减少到每个请求的一行。我将尝试一下,谢谢。你不必预先写上“R-”和“PO-”,这只是为了清楚起见如果使用强制转换,请记住使用它报告,否则它将返回无效的数据类型
SELECT DISTINCT Requisition.Number,  IssuedPO.Number, Job.Number
        FROM Requisition
        INNER JOIN RequisitionItem on RequisitionItem.RequisitionID = Requisition.ID
        LEFT OUTER JOIN Job_Activity on RequisitionItem.JobActivityID = Job_Activity.ID
        LEFT OUTER JOIN Job on Job_Activity.JobID = Job.ID
        LEFT OUTER JOIN IssuedPO on RequisitionItem.IssuedPOID = IssuedPO.ID
select  'R-' + cast(r.number as varchar(32)) as RequisitionNumber
,       (
        select  'PO' + CAST(ip.number as varchar(32)) + ';'
        from    IssuedPO ip
        join    RequisitionItems ri
        on      ip.id = ri.IssuedPOID
        where   ri.RequisitionID = r.id
        for xml path('')
        ) as POList
,       (
        select  'J-' + CAST(j.number as varchar(32)) + ';'
        from    Job j
        join    Job_Activity ja
        on      j.id = ja.JobID
        join    RequisitionItems ri
        on      ri.Job_ActivityID = ja.id
        where   ri.RequisitionID = r.id
        for xml path('')
        ) as JobList
from    Requisition r