在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(因为不支持限制),感谢您提供的解决方案