【问题标题】:Append column values to certain records from duplicated records and remove duplicated records [closed]将列值附加到重复记录中的某些记录并删除重复记录[关闭]
【发布时间】:2020-04-28 06:57:13
【问题描述】:

这是创建表和一些数据的脚本。

--Students table ---------
CREATE TABLE [Students](
    [ID] [int] NOT NULL,
    [SubjectID] [int] NULL,
    [StudentName] [nvarchar](50) NULL,
    [ConcatTo] [bit] NULL
) ON [PRIMARY]
GO
INSERT [Students] ([ID], [SubjectID], [StudentName], [ConcatTo]) VALUES (1, 1, N'Mary', 1)
GO
INSERT [Students] ([ID], [SubjectID], [StudentName], [ConcatTo]) VALUES (2, 1, N'Brown', NULL)
GO
INSERT [Students] ([ID], [SubjectID], [StudentName], [ConcatTo]) VALUES (3, 2, N'Lily2', NULL)
GO
INSERT [Students] ([ID], [SubjectID], [StudentName], [ConcatTo]) VALUES (4, 2, N'Michilin2', 1)
GO
INSERT [Students] ([ID], [SubjectID], [StudentName], [ConcatTo]) VALUES (5, 2, N'Joshua2', NULL)
GO


select *from Students;

SELECT Main.SubjectID, main.Students As "Students" 
FROM
(
    SELECT DISTINCT t2.SubjectID, 
        (
            SELECT t1.StudentName + ' ' AS [text()]
            FROM dbo.Students t1
            WHERE t1.SubjectID = t2.SubjectID
            FOR XML PATH ('')
        ) Students
    FROM dbo.Students t2
) Main

Select From table 会有这个

最多我只知道这样选择,但我不知道如何像这样更新我的学生表

这是我对预期结果的截图。

如何使用“Lily2 Michilin2 Joshua2”更新 StudentName 列,其中 ConcatTo = 1 就像我的选择语句一样?然后去掉 Lily2 和 Joshua2 行?

【问题讨论】:

  • 不清楚你想要什么。请出示您的预期结果
  • 不要。不要在数据库中存储分隔数据。保持正常化。
  • @Squirrel 截图是我的预期结果。
  • expected result 图像令人困惑,与您想要的描述不符。请在text 中发布预期结果
  • 你读过sql脚本吗?没关系,我用更简单的方式告诉你。坚持

标签: sql-server sql-update partition redundancy for-xml-path


【解决方案1】:

您可以使用CTE 包装现有查询,然后使用它重新连接到您的原始查询并更新它

WITH CTE AS
(
    SELECT ID, Main.SubjectID, Main.Students As Students
    FROM
    (
        SELECT ID = MIN(CASE WHEN t2.ConcatTo IS NOT NULL THEN t2.ID END), t2.SubjectID, 
        (
            SELECT t1.StudentName + ' ' AS [text()]
            FROM  Students t1
            WHERE t1.SubjectID = t2.SubjectID
            FOR XML PATH ('')
        ) Students
        FROM  Students t2
        GROUP BY t2.SubjectID
    ) Main
)
UPDATE  s
SET     StudentName = c.Students
FROM    Students s
        inner join CTE c    ON  s.ID    = c.ID 

对于第二部分,只需删除 ConcatTo 为空

DELETE  s
FROM    Students s
WHERE   s.ConcatTo  IS NULL

【讨论】:

  • 你很酷。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-07
  • 1970-01-01
相关资源
最近更新 更多