【发布时间】:2017-08-23 12:46:12
【问题描述】:
我需要使用硬编码数据创建一个带有自定义元素的以下 XML。
表格架构:StudentMark:
CREATE TABLE [dbo].[StudentMark]
(
[StudentMarkId] int IDENTITY(1,1) NOT NULL,
[StudentId] uniqueidentifier NOT NULL,
[SubjectId] uniqueidentifier NOT NULL,
[Score] int NOT NULL,
[GeneratedOn] datetime2(2) NOT NULL,
[IsPass] bit NULL,
[Result] varchar(100) NULL,
CONSTRAINT [PK_StudentMark]
PRIMARY KEY CLUSTERED ([StudentMarkId] ASC)
) ON [PRIMARY]
样本种子数据
INSERT INTO [dbo].[StudentMark] ([StudentId], [SubjectId], [GeneratedOn], [Score])
VALUES ('FC3CB475-B480-4129-9190-6DE880E2D581', '0D72F79E-FB48-4D3E-9906-B78A9D105081', '2017-08-10 10:10:15', 95),
('0F4EF48C-93E3-41AA-8295-F6B0E8D8C3A2', '0D72F79E-FB48-4D3E-9906-B78A9D105081', '2017-08-10 10:10:15', 60),
('0F4EF48C-93E3-41AA-8295-F6B0E8D8C3A2', 'AB172272-D2E9-49E1-8040-6117BB6743DB', '2017-08-16 09:06:20', 25),
('FC3CB475-B480-4129-9190-6DE880E2D581', 'AB172272-D2E9-49E1-8040-6117BB6743DB', '2017-08-16 09:06:20', 45);
需求:我需要根据单一逻辑更新几列[IsPass] 和[Result]。
查询 #1:
UPDATE SM
SET SM.[Result] = CASE WHEN SM.[Score] >= 75 THEN N'OUTSTANDING'
WHEN SM.[Score] >= 60 AND [Score] < 75 THEN N'VERY GOOD'
WHEN SM.[Score] >= 50 AND [Score] < 60 THEN N'GOOD'
WHEN SM.[Score] >= 40 AND [Score] < 50 THEN N'AVERAGE'
ELSE N'FAIL' END
FROM [dbo].[StudentMark] SM
查询 #2:
UPDATE SM
SET SM.[IsPass] = CASE WHEN SM.[Result] = N'FAIL' THEN 0 ELSE 1 END
FROM [dbo].[StudentMark] SM
我如何将这两个查询合并到一个
UPDATE查询中而不 复制CASE WHEN。
请帮助我。
【问题讨论】:
-
通常多次存储相同的信息(分数、分数作为文本、通过/失败)是一个坏主意,因为如果您更新数据,那么此时可能会遗漏某些内容,然后数据不匹配.在其他地方(应用层、视图、计算列)仅使用分数 + 逻辑可能值得考虑
标签: sql sql-server sql-update sql-server-2016 case-when