2013-05-06 43 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