0

我有一个名为 MyTable 的表,其中包含字段 Id(int)、Name(nvarchar)、Value1(bit)、Value2(bit) 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中Id的那些......

我想要做的是找到重复项并在重复组的所有 Value1 之间进行逻辑 OR 并使用该值更新重复项中的每条记录,然后对 value2 进行相同的操作。

前任:

对于上面的示例,将有 2 组重复项

结果将是:

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

我怎样才能做到这一点 ?

4

2 回答 2

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小提琴

解释: cast(Value1 as int)是必需的,因为SUM不会起作用bit。然后cast(SUM(cast(Value1 as int))as bit)将任何非零值转换为 1(true)。

参考

于 2013-05-07T08:28:28.160 回答
0

我对您的问题做了一些假设,并在此处生成了一个SQLFiddle

我所做的假设是您最多只能有两个组数,也就是说,每个名称最多只能重复一次。如果这是正确的,这就是你可以做的。您在 SQL Server 中使用按位函数对值进行“或”运算。因此,使用 ORed 值更新每个名称的每一行的查询可能是:

;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 语句。

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 中,bit 列中的值为 0 表示 false,1 为 true,因此,您可能希望直接使用这些。

如果您可以拥有多个具有相同 Name 值的元组,请告诉我...顺便说一句,您能告诉我们您为什么要这样做吗?

这是在 SQL Server 2008 中执行按位运算的参考。

MSDN 文章按位运算

于 2013-05-07T02:48:22.653 回答