2016-06-08 81 views
2

我有以下结果存储在一个临时表#tempResult更新只在SQL Server中的一个记录有条件

SourceGuid   SourceTypeID   IsSelected 
-------------------- -------------------- ---------- 
84588BAF068320450908  129     0 
5367D0F80A0F4040E909  658     0 < 
872791440CDBE04F7C0B  658     0 < 
15ABA6B70E4A70463E0B  887     0 
1DE39F9805A8A044B20B  887     0 
3F96C93501144041D50A  887     0 
6A01DFF705861049F509  887     0 

我需要IsSelected价值1的只有一个,而不是标有记录的两个<为1无论任何其他条件只是SourceTypeID = 658

我该如何做到这一点,谢谢。

+0

所以你只需要一行来更新,但不是全部,基于'WHERE'条件? –

+0

更新tbl_name set column = yourvalue WHERE condition = true – Mono

+0

@FelixPamittan是和只有一个记录其中sourceid = 658并非全部 – RandomUser

回答

1

你可以使用一个CTE得到TOP 1然后做UDPATE

;WITH CTE AS(
    SELECT TOP (1) * 
    FROM #tempResult 
    WHERE SourceTypeId = 658 
    ORDER BY NEWID() 
) 
UPDATE CTE SET IsSelected = 1 

ORDER BY NEWID()表示随机排序。将NEWID()替换为您希望TOP所基于的列。

+0

有没有其他的方式来做到这一点? @Felix – Mukund

+0

我在执行语句时遇到错误,按顺序并且还与WITH – RandomUser

+0

错误,尝试在'WITH'子句前加';':'; WITH CTE AS ....' –

2
UPDATE tempResult 
    SET IsSelected = 1 
WHERE SourceGuid IN (
    SELECT SourceGuid 
    FROM tempResult 
    WHERE SourceTypeId = 658 
    LIMIT 1 
) 
+2

这只适用于MySQL。在SQL Server中,您需要Top 1。 – Mono

+0

是的,因为SQL集合函数top已被使用(因为不支持限制) – Prateek

1

您可以使用ROW_NUMBER()CTE

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

+1

感谢您的解决方案 – RandomUser