Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 消除串联字符串中的重复项_Sql Server_Tsql - Fatal编程技术网

Sql server 消除串联字符串中的重复项

Sql server 消除串联字符串中的重复项,sql-server,tsql,Sql Server,Tsql,我有一个将多个记录连接到一个字段的有效解决方案,但是我希望从连接的字段中消除重复项,并按另一个字段对值排序 以下是我所拥有的: CREATE VIEW vwImageDescriptions AS SELECT i.ItemId, STUFF(ImageDescriptions.line,1,2,'') AS ImageDescriptions FROM InventoryItems i CROSS APPLY ( SELECT DISTINCT CAST

我有一个将多个记录连接到一个字段的有效解决方案,但是我希望从连接的字段中消除重复项,并按另一个字段对值排序

以下是我所拥有的:

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%'
这是我的结果:

我想要的是不要有重复的图像描述,因此,例如,我只想在出现的每一行中看到“我的图像”一次,而不是两次。如您所见,我在代码中使用了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)

我通常这样写:

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)

去吧

我想这可以简化一点。据我所知,这将产生你所期待的结果。非常感谢您提供的表格和示例数据

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
--编辑--

就像我说的交叉应用是一个复杂的层次,这里不需要。但这应该做同样的事情

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

我得到以下错误:如果指定了select DISTINCT,则ORDER BY items必须出现在选择列表中。因此,我将p.序列添加到选择列表中,但仍然得到相同的错误。此外,我需要检查空字符串和空字符串,这就是为什么我使用CASE语句的原因。我仍然得到重复的结果,这是我最初问题中的问题。如果您可以发布表定义和示例数据,那么最大的帮助就是。这是一个很好的起点。编辑以添加表定义和示例数据。唯一的问题是它没有按序列号对照片描述进行排序。这是按字母顺序排列的。明白了,没问题。只需按p顺序订购即可。但是,由于这是一个聚合,您必须告诉它“按哪个”值排序。您可以使用交叉应用程序,但似乎增加了一层并不真正需要的复杂性。我永远无法让它使用交叉应用程序。如果你能把它贴在这里,只是为了我的教育?谢谢,好的。我得到了它。因此,您不需要DISTINCT关键字,因为您使用的是GROUP By,然后让我们使用ORDER By,我以前无法使用它,因为我使用的是DISTINCT。非常感谢!