Устранить дубликаты в объединенной строке - PullRequest
0 голосов
/ 11 мая 2018

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

Вот что у меня есть:

CREATE VIEW vwImageDescriptions AS
    SELECT i.ItemId, STUFF(ImageDescriptions.line,1,2,'') AS ImageDescriptions
    FROM InventoryItems i
    CROSS APPLY (
        SELECT DISTINCT CAST((select CASE When p.Description = '' or p.Description is null Then '' Else '; ' + p.Description END
        FROM Photos p
        WHERE p.ItemId = i.ItemId
        ORDER BY p.Sequence
        FOR XML PATH('')) AS nvarchar(max)) line
    ) ImageDescriptions
go

select i.ItemName, id.ImageDescriptions
FROM InventoryItems i join vwImageDescriptions id on i.ItemId = id.ItemId
where id.ImageDescriptions like '%pla%'

Это мой результат: enter image description here

Я хочу, чтобы у меня не было дублированных описаний изображений, поэтому, например, я хочу видеть «Мое изображение» только один раз в каждой строке, а не дважды. Как вы видите, я использовал DISTINCT в своем коде, но, похоже, это не работает.

Вот очень упрощенный DDL, чтобы увидеть проблему:

DROP TABLE IF EXISTS [InventoryItems]
DROP TABLE IF EXISTS Photos
GO
CREATE TABLE [dbo].[InventoryItems](
    [ItemId] [int] NOT NULL,
    [ItemName] [varchar](100) NOT NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[Photos](
    [ItemId] [int] NOT NULL,
    [Description] [varchar](175) NULL,
    [Sequence] [int] NOT NULL
) ON [PRIMARY]
GO

INSERT INTO [InventoryItems]([ItemId],[ItemName]) VALUES(311,'11" Round Vegetable Bowl');
INSERT INTO [InventoryItems]([ItemId],[ItemName]) VALUES(312,'13" Oval Serving Platter');
INSERT INTO [InventoryItems]([ItemId],[ItemName]) VALUES(313,'19" Oval Serving Platter');
INSERT INTO [InventoryItems]([ItemId],[ItemName]) VALUES(314,'Creamer');
INSERT INTO [InventoryItems]([ItemId],[ItemName]) VALUES(315,'Gravy Boat with Attached Underplate');
INSERT INTO [InventoryItems]([ItemId],[ItemName]) VALUES(317,'Round Butter Dish and Lid');
INSERT INTO [InventoryItems]([ItemId],[ItemName]) VALUES(318,'Sugar Bowl and Lid');
INSERT INTO [InventoryItems]([ItemId],[ItemName]) VALUES(319,'Vegetable Server Bowl and Lid');

INSERT INTO [Photos]([ItemId],[Description],[Sequence])VALUES(311,'',1)
INSERT INTO [Photos]([ItemId],[Description],[Sequence])VALUES(312,'Replacements.com image',1)
INSERT INTO [Photos]([ItemId],[Description],[Sequence])VALUES(313,'Replacements.com image',1)
INSERT INTO [Photos]([ItemId],[Description],[Sequence])VALUES(313,'Outer platter is the 19"',2)
INSERT INTO [Photos]([ItemId],[Description],[Sequence])VALUES(313,'Outer platter is the 19"',3)
INSERT INTO [Photos]([ItemId],[Description],[Sequence])VALUES(313,'Outer platter is the 19"',4)
INSERT INTO [Photos]([ItemId],[Description],[Sequence])VALUES(313,'Another image',5)
INSERT INTO [Photos]([ItemId],[Description],[Sequence])VALUES(314,'Replacements.com image',1)
INSERT INTO [Photos]([ItemId],[Description],[Sequence])VALUES(315,'From replacements.com',1)
INSERT INTO [Photos]([ItemId],[Description],[Sequence])VALUES(315,'My image',2)
INSERT INTO [Photos]([ItemId],[Description],[Sequence])VALUES(315,'My image',3)
INSERT INTO [Photos]([ItemId],[Description],[Sequence])VALUES(315,'My image',4)
INSERT INTO [Photos]([ItemId],[Description],[Sequence])VALUES(316,'My image',1)
INSERT INTO [Photos]([ItemId],[Description],[Sequence])VALUES(316,'My image',2)
INSERT INTO [Photos]([ItemId],[Description],[Sequence])VALUES(316,'From replacements.com',3)

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Я думаю, это можно немного упростить. Как я понимаю, желаемых результатов это должно дать то, что вы ищете. Большое спасибо за таблицы и примеры данных.

select i.ItemId
    , ImageDescriptions = isnull(STUFF((select ',' + isnull(p.Description, '')
            from Photos p
            where p.ItemId = i.ItemId
            group by isnull(p.Description, '')
            order by min(p.Sequence)
            for xml path('')), 1, 1, ''), '')
FROM InventoryItems i
group by i.ItemId

- EDIT -

Как я уже сказал, CROSS APPLY - это слой сложности, который здесь не нужен. Но это должно делать то же самое.

select i.ItemId
    , ImageDescriptions = isnull(x.asdf, '')
FROM InventoryItems i
cross apply
(
    select asdf = STUFF((select ',' + isnull(p.Description, '')
            from Photos p
            where p.ItemId = i.ItemId
            group by isnull(p.Description, '')
            order by min(p.Sequence)
            for xml path('')), 1, 1, '')
) x
0 голосов
/ 11 мая 2018

Я обычно пишу как ниже:

CREATE VIEW vwImageDescriptions AS
SELECT i.ItemId, STUFF(ImageDescriptions.line,1,1,'') AS ImageDescriptions
FROM InventoryItems i
CROSS APPLY (
    SELECT DISTINCT  '; ' + ISNULL(p.Description,'')
    FROM Photos p
    WHERE p.ItemId = i.ItemId
    ORDER BY p.Sequence
    FOR XML PATH('')
) ImageDescriptions(line)

GO

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