Sql server 合并交叉引用表中的行

Sql server 合并交叉引用表中的行,sql-server,merge,rows,junction-table,Sql Server,Merge,Rows,Junction Table,我想创建一个SQLServerSelect语句,其中交叉引用的数据位于不同行的一列中。如果可能的话,我想用一些东西,不;带着命令 合同表 公司表 承包商交叉参考表连接表 ID ContractID_ CompanyID_ 1 1 1 2 1 2 3 2 3 4 3 1 5 3 4 6 3 5 我想要这个

我想创建一个SQLServerSelect语句,其中交叉引用的数据位于不同行的一列中。如果可能的话,我想用一些东西,不;带着命令

合同表

公司表

承包商交叉参考表连接表

ID  ContractID_ CompanyID_
1   1               1
2   1               2
3   2               3
4   3               1
5   3               4
6   3               5
我想要这个结果:

Contract.ID company.Name
1           a_ltd, b_ltd
2           c_ltd
3           a_ltd, d_ltd, e_ltd
填充数据:

选择:

选择结果:不需要

要求的结果:


您可以执行以下操作:

SELECT x.id
  , left(CompanyName, len(CompanyName)-1) as CompanyName
FROM
(
  SELECT DISTINCT ct.id
    , (SELECT CAST(co.Name + ', ' AS VARCHAR(MAX)) 
           FROM contractcompanycrossref cc
           LEFT JOIN company co
            on cc.companyid = co.id
           WHERE (cc.contractid = ct.id) 
           FOR XML PATH ('')
        ) AS CompanyName
  from contract ct
  left join contractcompanycrossref cc
    on ct.id = cc.contractid
) x

请参见试试这个。我没有测试代码,因为我没有这些表的ddl。但是它应该可以工作

       SELECT ct.id ,
 left(companyname.value('.','varchar(max)'), len(companyname.value('.','varchar(max)'))-1) as companyname 
from 
    contract ct 
    cross apply 
    ( 
    select cm.name + ',' [text()]
    from 
    contractcompanycrossref cc 

    inner join company cm
    on cc.companyid = cm.ID
      where ct.id = cc.contractid 
    for xml path (''),type
    ) cmnames(companyname)

为什么你的需求包括东西而没有CTE?我读了很多关于XML路径和东西的书来制作这个解决方案。这是我的结果:id CompanyName 1 a_ltd 2 b_ltd 3 c_ltd你看到我的SQL小提琴了吗?它正在生成您要求的结果。语法有问题,但我已经有了解决方案。非常感谢。Msg 156,级别15,状态1,第10行关键字“on”附近的语法不正确。抱歉,现在重试我已在您提供的链接上进行了测试..sqlfiddle.com/!3/f3004/18它正在工作。非常感谢。你知道结果是什么吗;当公司名称中有&character时,请使用&ersand字符,而不是&ersand字符。是校勘吗?数据库:“a<d”-结果:“a&;这与xml有关,但在上面的链接中没有显示amp;它在上面的链接上运行良好,但在sql server上则不行。我发现了一篇关于这方面的文章:
create table #Contract (ID INT, Subject VARCHAR(1))
INSERT  #Contract
SELECT  1, 'a' UNION ALL
SELECT  2, 'b' UNION ALL
SELECT  3, 'c'

create table #Company (ID INT, Name VARCHAR(5))
INSERT  #Company
SELECT  1, 'a_ltd' UNION ALL
SELECT  2, 'b_ltd' UNION ALL
SELECT  3, 'c_ltd' UNION ALL
SELECT  4, 'd_ltd' UNION ALL
SELECT  5, 'e_ltd'

create table #ccRef (ID INT, ContractID_ INT, CompanyID_ INT)
INSERT  #ccRef
SELECT  1, 1, 1 UNION ALL
SELECT  2, 1, 2 UNION ALL
SELECT  3, 2, 3 UNION ALL
SELECT  4, 3, 1 UNION ALL
SELECT  5, 3, 4 UNION ALL
SELECT  6, 3, 5 
select #Contract.ID, #Company.Name from #Contract
inner join #ccRef on #Contract.ID = #ccRef.ContractID_ inner join #Company
on #ccRef.CompanyID_ = #Company.ID
ID  Name
1   a_ltd
1   b_ltd
2   c_ltd
3   a_ltd
3   d_ltd
3   e_ltd
Contract.ID company.Name
1           a_ltd, b_ltd
2           c_ltd
3           a_ltd, d_ltd, e_ltd
SELECT x.id
  , left(CompanyName, len(CompanyName)-1) as CompanyName
FROM
(
  SELECT DISTINCT ct.id
    , (SELECT CAST(co.Name + ', ' AS VARCHAR(MAX)) 
           FROM contractcompanycrossref cc
           LEFT JOIN company co
            on cc.companyid = co.id
           WHERE (cc.contractid = ct.id) 
           FOR XML PATH ('')
        ) AS CompanyName
  from contract ct
  left join contractcompanycrossref cc
    on ct.id = cc.contractid
) x
       SELECT ct.id ,
 left(companyname.value('.','varchar(max)'), len(companyname.value('.','varchar(max)'))-1) as companyname 
from 
    contract ct 
    cross apply 
    ( 
    select cm.name + ',' [text()]
    from 
    contractcompanycrossref cc 

    inner join company cm
    on cc.companyid = cm.ID
      where ct.id = cc.contractid 
    for xml path (''),type
    ) cmnames(companyname)