2012-07-26 70 views
0

我想創建一個SQL Server select語句,其中交叉引用的數據位於不同行的一列中。我想使用stuff(如果可能)和沒有;with命令。合併來自交叉引用表的行

合同

ID Subject 
1 a 
2 b 
3 c 

公司

ID Name 
1 a_ltd 
2 b_ltd 
3 c_ltd 
4 d_ltd 
5 e_ltd 

ContractContractorCrossRef表(結合表)

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 

填充數據:

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

[**你嘗試過什麼?**](http://whathaveyoutried.com) – 2012-07-26 15:15:46

+1

爲什麼你的要求包括'stuff'和沒有CTE? – 2012-07-26 15:26:13

+0

我讀了很多關於XML Path和STUFF的信息來製作這個解決方案。 – Satu 2012-07-26 16:18:00

回答

0

試試這個。我沒有測試的代碼,因爲我沒有對這些tables.But它應該工作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) 
+0

語法有點問題,但我已經有了一個解決方案。謝謝。 「Msg 156,Level 15,State 1,Line 10 關鍵字'on'附近的語法錯誤。」 – Satu 2012-07-26 16:24:13

+0

它現在已經修復。 – 2012-07-26 17:00:11

+0

不工作,對不起。 http://sqlfiddle.com/#!3/f3004/18 – Satu 2012-07-26 17:50:03

0

你可以做到以下幾點:

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 

SQL Fiddle with Demo

+0

這是我的結果:
ID \t公司名稱
a_ltd
b_ltd
c_ltd
Satu 2012-07-26 16:04:05

+0

你有沒有看到我的SQL小提琴?它產生你要求的結果。 – Taryn 2012-07-26 16:06:50

+0

對不起......我已經看到了。謝謝!這是工作! – Satu 2012-07-26 16:11:31