Получаете список разделенных запятыми PK для дубликатов записи в SQL Server 2005? - PullRequest
0 голосов
/ 10 октября 2009

Это ответ на предыдущий вопрос, который у меня был: Немного размыто при получении DISTINCT для одного столбца?

Этот запрос имеет немного больше смысла, учитывая данные:

SELECT     Receipts.ReceiptID, FolderLink.ReceiptFolderID
FROM         dbo.tbl_ReceiptFolderLnk AS FolderLink INNER JOIN
             dbo.tbl_Receipt AS Receipts ON FolderLink.ReceiptID = Receipts.ReceiptID 

С результатами:

ReceiptID            ReceiptFolderID       NewColumn (duplicate folder ID list)
-------------------- ---------------      ----------
1                    3
2                    3
3                    7
4     <--->          4                       8,9
5                    4
6                    1
3                    8
4     <--->          8                       4,9
4     <--->          9                       4,8

Этот ответ позволил мне увидеть отличные (ReceiptID) ... отличные. Теперь для этих идентификаторов 3 и 4 они существуют в нескольких ReceiptFolderID.

Учитывая этот неуникальный список ReceiptID, я бы хотел дополнительный столбец с разделенными запятыми ReceiptFolderLinkID, где также существует ReceiptID.

Таким образом, для ReceiptID = 4 новый столбец, скажем, DuplicateFoldersList, должен читать «8,9» и т. Д. И аналогично с ID = 3 или любыми другими дубликатами.

Так что, в принципе, я бы хотел, чтобы в другом столбце были указаны дополнительные вхождения ReceiptFolderID ReceiptID в других папках.

Спасибо!

Ответы [ 2 ]

1 голос
/ 10 октября 2009

Вы можете создать функцию, которая, учитывая ReceiptID и «текущий» ReceiptFolderID для этой строки, возвращает другие ReceiptFolderID в виде составного списка, разделенного запятыми. Пример:

CREATE FUNCTION [dbo].[GetOtherReceiptFolderIDs](@receiptID int, @receiptFolderID int)
RETURNS varchar(MAX) AS
BEGIN
    DECLARE @returnValue varchar(MAX)

    SELECT   @returnValue = COALESCE(@returnValue + ', ', '') + COALESCE(CONVERT(varchar(MAX), ReceiptFolderID), '')
    FROM     tbl_ReceiptFolderLink AS FolderLink
    WHERE    FolderLink.ReceiptID = @receiptID
    AND      FolderLink.ReceiptFolderID <> @receiptFolderID

    RETURN @returnValue
END

Затем вы можете запустить запрос, который использует эту функцию для получения вашего нового столбца:

SELECT      Receipts.ReceiptID, ReceiptFolderID, dbo.GetOtherReceiptFolderIDs(Receipts.ReceiptID, ReceiptFolderID) AS NewColumn
FROM        tbl_Receipt AS Receipts
INNER JOIN  tbl_ReceiptFolderLink AS FolderLinks
ON          Receipts.ReceiptID = FolderLinks.ReceiptID

Я проверил это, и оно дает следующие результаты (если я правильно понял вашу схему):

ReceiptID    ReceiptFolderID    NewColumn
6            1                  NULL
1            3                  NULL
2            3                  NULL
4            4                  8, 9
5            4                  NULL
3            7                  8
3            8                  7
4            8                  4, 9
4            9                  4, 8
0 голосов
/ 10 октября 2009

В Mysql есть агрегатная функция group_concat, но в T-SQL и oracle вам нужно использовать другой подход ... Этот сайт перечисляет несколько подходов для T-SQL, но ни один из них не является очень простым и легким (как и MySQL)

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