在SQL Server中仅有条件地更新一条记录
我将以下结果存储在临时表在SQL Server中仅有条件地更新一条记录,sql,sql-server,tsql,sql-update,Sql,Sql Server,Tsql,Sql Update,我将以下结果存储在临时表#tempResult SourceGuid SourceTypeID IsSelected -------------------- -------------------- ---------- 84588BAF068320450908 129 0 5367D0F80A0F4040E909 658 0 < 872791440CDBE0
#tempResult
SourceGuid SourceTypeID IsSelected
-------------------- -------------------- ----------
84588BAF068320450908 129 0
5367D0F80A0F4040E909 658 0 <
872791440CDBE04F7C0B 658 0 <
15ABA6B70E4A70463E0B 887 0
1DE39F9805A8A044B20B 887 0
3F96C93501144041D50A 887 0
6A01DFF705861049F509 887 0
SourceGuid SourceTypeID已选择
-------------------- -------------------- ----------
84588BAF068320450908 129 0
5367D0F80A0F4040E909 658 0<
872791440CDBE04F7C0B 658 0<
15ABA6B70E4A70463E0B 887 0
1DE39F9805A8A044B20B 887 0
3F96C93501144041D50A 887 0
6A01DFF70585861049F509887 0
我需要将IsSelected值设置为标有
的记录的中的一个,而不是两个。您可以使用CTE
获取前1个,然后执行UDPATE
:
;WITH CTE AS(
SELECT TOP (1) *
FROM #tempResult
WHERE SourceTypeId = 658
ORDER BY NEWID()
)
UPDATE CTE SET IsSelected = 1
orderbynewid()
表示随机排序。将NEWID()
替换为您希望TOP
所基于的列。您可以使用行号()
和CTE
:
UPDATE tempResult
SET IsSelected = 1
WHERE SourceGuid IN (
SELECT SourceGuid
FROM tempResult
WHERE SourceTypeId = 658
LIMIT 1
)
WITH CTE AS(
SELECT t.*,
ROW_NUMBER() OVER(PARTITION BY t.SourceTypeID ORDER BY t.sourceGuid) as rnk
FROM YourTable t)
UPDATE CTE
set IsSelected = 1
WHERE rnk = 1
这将是动态的,适用于整个数据,如果您只想更新SourceTypeID=658
,则添加WHERE
子句:
WHERE SourceTypeId = 658
在CTE
中,因此您只需要根据WHERE
condition更新一行,而不是全部?Update tbl\u name set column=yourvalue WHERE condition=true@FelixPamittan是,并且只有一条sourceid=658的记录不是all@Mono你的建议将更新这两个记录,对吗?是的,会的,现在我看到了你的编辑。以前不清楚。但是您想如何确定应该更新哪一个呢?还有其他方法吗@Felixi在执行语句时出错,原因是WITH@RandomUser,如果您想在多个SourceTypeId
上进行筛选,@sagi的答案是可行的。这只适用于MySQL。在SQL Server中,您需要Top 1。是的,对于SQL聚合函数,必须使用Top(因为不支持限制),感谢您提供的解决方案