Используя MS SQL Server 2005, как я могу объединить подробные записи в один список, разделенный запятыми - PullRequest
2 голосов
/ 13 февраля 2009

ПРЕДПОСЫЛКИ: ** Я работаю ** MS2005 . У меня есть таблица MASTER (ID, MDESC) и таблица DETAIL (MID, DID, DDESC) со следующими данными

1 MASTER_1
2 MASTER_2
1 L1 DETAIL_M1_L1
1 L2 DETAIL_M1_L2
1 L3 DETAIL_M1_L3
2 L1 DETAIL_M2_L1
2 L2 DETAIL_M2_L2

Если я присоединюсь к столам с

SELECT M.*, D.DID FROM MASTER M INNER JOIN DETAIL D on M.ID = D.MID

Я получаю список, подобный следующему:

1 MASTER_1 L1
1 MASTER_1 L2
1 MASTER_1 L3
2 MASTER_2 L1
2 MASTER_2 L2

ВОПРОС: Есть ли способ использовать оператор выбора MS SQL для получения подробных записей в список через запятую, например так:

1 MASTER_1 "L1, L2, L3"
2 MASTER_2 "L1, L2"

Ответы [ 5 ]

3 голосов
/ 13 февраля 2009

Вам нужна функция: -

 CREATE FUNCTION [dbo].[FN_DETAIL_LIST]
 (
     @masterid int
 )
 RETURNS varchar(8000)
 AS 
 BEGIN
     DECLARE @dids varchar(8000)

     SELECT @dids = COALESCE(@dids + ', ', '') + DID
     FROM DETAIL
     WHERE MID = @masterid
     RETURN @dids
 END

Использование: -

SELECT MASTERID, [dbo].[FN_DETAIL_LIST](MASTERID) [DIDS]
FROM MASTER
2 голосов
/ 13 февраля 2009

Благодаря концепции, приведенной в ссылке Билла Карвина, именно CROSS APPLY заставляет его работать

SELECT ID, DES, LEFT(DIDS, LEN(DIDS)-1) AS DIDS
 FROM MASTER M1 INNER JOIN DETAIL D on M1.ID = D.MID 
  CROSS APPLY (
    SELECT DID + ', '
    FROM MASTER M2 INNER JOIN DETAIL D on M2.ID = D.MID 
    WHERE M1.ID = M2.ID
    FOR XML PATH('')
   ) pre_trimmed (DIDS)
GROUP BY ID, DES, DIDS

РЕЗУЛЬТАТЫ:

ID  DES        DIDS
--- ---------- ---------------
1   MASTER_1   L1, L2, L3
2   MASTER_2   L1, L2
1 голос
/ 13 февраля 2009

Это цель агрегатной функции MySQL GROUP_CONCAT(). К сожалению, дублировать эту функцию не так просто в других брендах РСУБД, которые ее не поддерживают.

См. Имитация функции MySQL group_concat в Microsoft SQL Server 2005?

1 голос
/ 13 февраля 2009

слиться твой друг.

declare @CSL vachar(max)

set @CSL = NULL
select @CSL = coalesce(@CSL + ', ', '') + cast(DID as varchar(8))
from MASTER M INNER JOIN DETAIL D on M.ID = D.MID

select @CSL

Это не будет работать хорошо для обобщенного запроса (т.е. отлично работает для одной основной записи).

Вы можете включить это в функцию ... но это может не дать вам производительность, которую вы хотите / хотите.

0 голосов
/ 13 февраля 2009

Я думаю, вам нужна функция для правильной работы в последней версии SQL Server:

http://sqljunkies.com/WebLog/amachanic/archive/2004/11/10/5065.aspx?Pending=true

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...