我有下表:
SubjectID AttributeID ValueID
1 1 2
1 1 3
1 2 1
2 1 3
2 2 1
1 3 1
属性可以有多个值(上表中针对同一属性有多个外观)。 对同一属性(不同的值)的出现次数没有约束。
我不想使用SubjectID = 1更新主题,将ValueID更改为仅1,其中AttributeID为1,所以
之前:
Select * from Subject WHERE SubjectID=1 AND AttributeID=1
--returns:
SubjectID AttributeID ValueID
1 1 2
1 1 3
后:
Select * from Subject WHERE SubjectID=1 AND AttributeID=1
--returns:
SubjectID AttributeID ValueID
1 1 1
我使用带有可选参数的存储过程执行此操作(全部为null并仅更新提供的属性),现在这不是问题。我的问题是:
更新此行的最佳做法是什么?我认为以下答案是可行的:
还有其他想法吗?
答案 0 :(得分:2)
您只能更新一行,然后删除其他行,如下所示:
set rowcount 1;
update Subject
set ValuedID = 1
where SubjectID = 1
and AttributeID = 1;
set rowcount 0;
delete Subject
where SubjectID = 1
and AttributeID = 1
and ValuedID <> 1;
答案 1 :(得分:1)
使用set rowcount
is deprecated,改为使用"provided"
。
重要
在将来的SQL Server发行版中,使用SET ROWCOUNT不会影响DELETE,INSERT和UPDATE语句。避免在新的开发工作中使用SET ROWCOUNT和DELETE,INSERT和UPDATE语句,并计划修改当前使用它的应用程序。对于类似的行为,请使用TOP语法。有关更多信息,请参阅TOP(Transact-SQL)。
top (n)
rextester演示:http://rextester.com/ATDKI87027
返回:
update top (1) Subject
set ValueID = 1
where SubjectID = 1
and AttributeID = 1;
delete Subject
where SubjectID = 1
and AttributeID = 1
and ValueID <> 1;