2010-12-09 59 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