2014-02-13 70 views
0

我希望我能很好地解釋我的問題。
我有一個沒有主鍵的表。爲了得到唯一的行,我必須select distinct (make, model, category,onhand)在一起,結果是2行的每一個與現有量is null和其他現有量is not null
sql server更新同一表中的重複行

現在我要做的就是更新我的表set null onhand = onhand with value每個重複行
我有這個查詢找到重複-2爲每個

select distinct MAKE, MODEL, category, PRGR, 
CountDuplicateRows= COUNT(1) --column to count the number of duplicates 
from [OITM2] 
WHERE PRGR !='p' 
GROUP BY MAKE, MODEL, category, PRGR 
HAVING COUNT(1)>1 --more than one record 
ORDER BY COUNT(1) DESC --sort by most duplicates 

但我無法弄清楚如何更新手動null。我正在使用SQL Server 2008 R2。
謝謝

回答

2

SQL Server有可更新的CTE和子查詢的很不錯的功能。你可以這樣做:

with toupdate as (
     select t.*, 
      count(*) over (partition by MAKE, MODEL, category, PRGR) as cnt 
     from oitm2 
     where prgr <> 'p' 
    ) 
update toupdate 
    set onhand = YOURVALUEGOESHERE 
    where cnt > 1 and onhand is null; 

注意,子查詢不使用聚合,而是使用count()窗口功能。這會將計數附加到原始數據的每一行,並且仍可用於更新。

如果你想從同一組行的任意值,你可以添加到toupdate

with toupdate as (
     select t.*, 
      count(*) over (partition by MAKE, MODEL, category, PRGR) as cnt, 
      max(onhand) over (partition by MAKE, MODEL, category, PRGR) as onhand_value 
     from oitm2 
     where prgr <> 'p' 
    ) 
update toupdate 
    set onhand = onhand_value 
    where cnt > 1 and onhand is null; 
+0

日Thnx很多,第二個就是我到底需要! – Sam