2010-12-09 3 views
0

Есть две таблицы,Нужна помощь по написанию запроса SQL Server

Таблица A

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

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

Таблица B (A_ID - это внешний ключ ссылки 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, к сожалению, мой домен DB службы - это 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

«Лучший» - относительный термин. Я бы, вероятно, использовал несколько запросов и объединил строку в коде.

Вы можете создать скалярную пользовательскую функцию, которая принимает 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

I 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