2016-06-08 76 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