Нужна помощь в написании запроса SQL Server - PullRequest
0 голосов
/ 09 декабря 2010

Есть две таблицы,

Таблица A

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

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

Таблица B (A_ID - ссылки на внешние ключи ТаблицаA_ID A)

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?Спасибо!

Ответы [ 6 ]

0 голосов
/ 09 декабря 2010
SELECT a.A_ID
     , a.A_Field
     , (SELECT CAST(b.B_Field+ ', ' AS VARCHAR(MAX)) 
         FROM table_B b
         WHERE (a.A_ID= b.A_ID) 
         FOR XML PATH ('')
      )AS whatever FROM table_a a

Это должно работать, как вы хотите. Приветствия. Попробуйте также это

Как создать функцию SQL Server для "объединения" нескольких строк из подзапроса в одно поле с разделителями?

0 голосов
/ 09 декабря 2010

Не знаю, лучший ли это способ, но он работает:

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 голосов
/ 09 декабря 2010

Вы будете использовать группирование по функциям для объединения значений столбца B_Field, и вы можете обратиться к этой публикации о помощи по канкатизации строк

0 голосов
/ 09 декабря 2010

Попробуйте что-то вроде (* Полный пример *)

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 голосов
/ 09 декабря 2010

Чтобы получить результаты по вашему запросу, вам нужно объединить две таблицы.Вот пример:

SELECT A_ID, A_FIELD, B_FIELD 
FROM Table A
LEFT JOIN Table B ON Table A.A_ID = Table B.A_ID
0 голосов
/ 09 декабря 2010

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

Вы можете создать скалярный UDF, который принимает A_ID в качестве параметра и строит денормализованную строку из таблицы B. Ваш конечный SELECT будет:

SELECT A.A_ID, A.A_Field, dbo.myUDF(A.A_ID)
FROM A
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...