2010-12-09 60 views
0

有兩個表,需要幫助的編寫SQL Server查詢

表A

A_ID A_Field 
1   blah1 
2   blah2 
3   blah3 
........ 

===================== =======================================

表B(A_ID是外鍵參考表A的A_ID)

A_ID B_Field 
1  a 
1  b 
1  c 
2  a 
2  b 
2  c 

什麼是最好的辦法得到結果如下圖所示:

A_ID A_Field B_Field 
1  blah1  a,b,c 
2  blah2  a,b,c 

非常感謝您的答覆,他們所有的作品,但是,還有一個要求,「對XML」 DOWS不能在SQL Server 2000中的工作,遺憾的是我的域名服務的數據庫是SQL Server 2000,是否有SQL SERVER 2000的簡單查詢工作?謝謝!

回答

0

試試樣(*全實施例*)

DECLARE @TableA TABLE(
     A_ID INT, 
     A_Field VARCHAR(20) 
) 
INSERT INTO @TableA SELECT 1,'blah1' 
INSERT INTO @TableA SELECT 2,'blah2' 
INSERT INTO @TableA SELECT 3,'blah3' 

DECLARE @TableB TABLE(
     A_ID INT, 
     B_Field VARCHAR(20) 
) 
INSERT INTO @TableB SELECT 1,'a' 
INSERT INTO @TableB SELECT 1,'b' 
INSERT INTO @TableB SELECT 1,'c' 
INSERT INTO @TableB SELECT 2,'a' 
INSERT INTO @TableB SELECT 2,'b' 
INSERT INTO @TableB SELECT 2,'c' 

;WITH Vals AS (
    SELECT a.A_ID, 
      a.A_Field, 
      b.B_Field 
    FROM @TableA a INNER JOIN 
      @TableB b ON a.A_ID = b.A_ID 
) 
SELECT p1.A_ID, 
     p1.A_Field 
     ,STUFF( 
       (SELECT 
        ', ' + p2.B_Field 
        FROM Vals p2 
        WHERE p2.A_ID=p1.A_ID 
        ORDER BY p2.A_ID 
        FOR XML PATH(''), TYPE 
       ).value('.','varchar(max)') 
       ,1,2, '' 
     ) AS B_Field 
FROM Vals p1 
GROUP BY p1.A_ID, 
      p1.A_Field 

輸出

A_ID A_Field B_Field 
1 blah1 a, b, c 
2 blah2 a, b, c 
+0

非常感謝!但是,還有一個請求,「對於XML」不適用於SQL SERVER 2000,不幸的是我的域服務的數據庫是SQL Server 2000,是否有SQL SERVER 2000的簡單查詢工作?謝謝! – 2010-12-09 13:43:22

+0

在這種情況下,您將不得不創建一個用戶定義函數... – 2010-12-09 13:45:03

0

「最好」是一個相對術語。我可能會使用多個查詢並在代碼中連接字符串。

您可以創建一個標量UDF是需要A_ID作爲參數,並從表B.構建非規範化串您的最終SELECT是:

SELECT A.A_ID, A.A_Field, dbo.myUDF(A.A_ID) 
FROM A 
0

爲了獲得成功,你問你需要加入兩張表。下面是一個例子:

SELECT A_ID, A_FIELD, B_FIELD 
FROM Table A 
LEFT JOIN Table B ON Table A.A_ID = Table B.A_ID 
0

您將使用一組由函數來連接列B_Field值你可以參考this帖子上關於字符串的幫助

0

我d on't知道這是否是最好的方式,但它的工作原理:

declare @rv table (a_id int, a_field varchar(50), b_field varchar(50)) 
insert into @rv (a_id, a_field) select a_id, a_field from a 

declare @id int 
declare @b varchar(50) 
declare cur cursor for select a_id from @rv 
open cur 
fetch next from cur into @id 
while @@fetch_status = 0 begin 
    set @b = '' 
    select @b = @b + ',' + b_field from b where a_id = @id 
    if len(@b) > 1 set @b = substring(@b, 2, len(@b)-1) 
    update @rv set b_field = @b where a_id = @id 
    fetch next from cur into @id 
end 
close cur 
deallocate cur 
select * from @rv 
+0

非常感謝!但是,它仍然有點複雜,對不起:) – 2010-12-09 13:35:18