2013-05-06 47 views
0

我有一個名爲MyTable的與領域表ID(INT),姓名(NVARCHAR),值1(位),值2(位) EX:查找與扭曲的重複

1 Nathan True False 
2 Nathan True False 
3 John True False 
4 John False True 

,所以我可以很容易地找到名稱重複這樣的:

select 'First_Id'=a.Id,'First_Value1'=a.Value1,'First_Value2'=a.Value2, 
     'Second_Id'=b.Id,'Second_Value1'=b.Value1,'Second_Value2'=b.Value2 
     from MyTable a, MyTable b where a.Id>b.Id 
     and a.Name = b.Name 

,然後我可以與標識在SecondId刪除的...

我想要做的就是找到重複的做一個邏輯或所有的之間重複組的值1,並用具有該值的副本更新每條記錄中的每條記錄,然後針對值2更新相同的記錄。

EX:

對於上面的例子中會有2組重複

的,其結果將是:

1 Nathan True False 
2 Nathan True False 
3 John True True 
4 John True True 

我怎樣才能做到這一點?

+0

你是說,你要更新'Value1'和'Value2'每個組,使他們同在該組中的第一行? – imthepitts 2013-05-06 21:18:52

回答

1

試試這個:

update a set a.Value1=b.new_value1 ,a.Value2=b.new_value2 

from MyTable a 
inner join 
(select Name,cast(SUM(cast(Value1 as int))as bit) new_value1, 
cast(SUM(cast(Value2 as int)) as bit) new_value2 from MyTable 
group by Name) b 

on a.Name=b.Name; 

select * from MyTable 

SQL Fiddle

說明:cast(Value1 as int)需要爲SUM會不工作bit。然後cast(SUM(cast(Value1 as int))as bit)將任何非零值轉換爲1(真)。

Reference

+0

@Nathan:這有幫助嗎? – 2013-05-07 09:43:16

+0

是的......這正是我所需要的......我不明白,雖然這種鑄造從int到bit是什麼......每個大於0的數字在鑄造時被視爲1(真)......爲什麼? – Nathan 2013-05-07 13:16:56

+0

你是對的。這可以被刪除。 – 2013-05-07 13:20:46

0

我做了你的問題的一些假設,併產生了SQLFiddle Here

我的假設是,你只會有兩個最大的組數,也就是說,每個名稱只複製,頂多一旦。如果這是正確的,這是你可以做的。您可以在SQL Server中使用按位函數將「或」值組合在一起。因此,要更新每一行與或運算值每名查詢可能是:

;with upd_val_cte as 
(select a.Name, (a.Value1 | b.Value1) as Value1, 
(a.Value2 | b.Value2) as Value2 
from MyTable a 
join MyTable b 
on a.Name=b.Name 
and a.id<b.id) 

update MyTable 
set Value1=d.Value1, 
    Value2=d.Value2 
from upd_val_cte d 
where MyTable.Name=d.Name 

爲了看的話,結果「真」或「假」,你已經證明,你可以使用下面的選擇語句。

select id, Name, case when Value1=1 then 'true' else 'false' end as Value1, 
       case when Value2=1 then 'true' else 'false' end as Value2 
from MyTable 

在SQL Server中,位列中的值0代表假,而1爲真,因此,您可能希望直接使用這些值。

如果你可以有多個具有相同名稱值的元組,請告訴我......順便說一下,你能告訴我們爲什麼要這樣做嗎?

下面是在SQL Server做位運算的參考2008年

MSDN article on Bitwise operations

+0

你的查詢看起來不錯,但它不會給出正確的答案,如果我再添加一個Nathan 0 1 .. – Nathan 2013-05-07 13:15:44