将count作为条件更新记录

时间:2014-02-01 10:59:58

标签: sql sql-server-2005

我需要将重复的记录更新为无效,但只保留记录。

我的表格结构如下:

字段名称

id (primary key)
phoneNo
IsValid

样本数据如下:

id       |  phoneNo     | IsValid          
--------------------------------------
1        |  011         |    1
2        |  011         |    1
3        |  022         |    1
4        |  022         |    1
5        |  033         |    1
6        |  011         |    1

我的输出应该是这样的:

样本数据如下:

id       |  phoneNo     | IsValid          
--------------------------------------
1        |  011         |    0
2        |  011         |    0
3        |  022         |    0
4        |  022         |    1
5        |  033         |    1
6        |  011         |    1

最小ID或最大ID不是问题。只有条件是一个行应该作为有效行。

到目前为止我尝试了什么:

update phone set IsValid=0 where id in
 (select id  from phone
    where id not in (
       select MAX(id)id
       from phone 
       group by phoneNo
      having COUNT(phoneNo)>1))
and IsValid=1

在这种情况下,我的o / p如下:

id       |  phoneNo     | IsValid          
--------------------------------------
1        |  011         |    0
2        |  011         |    0
3        |  022         |    0
4        |  022         |    1
5        |  033         |    0
6        |  011         |    1

在这里 033 记录也标记为o,我该如何解决?

4 个答案:

答案 0 :(得分:3)

从您的查询中删除having子句,不需要它并尝试...

    update phone set IsValid=0 where id in
    (select id  from phone
    where id not in (
    select MAX(id)id
    from phone 
    group by phoneNo))
    and IsValid=1

答案 1 :(得分:1)

尝试此查询:

UPDATE phone t1 SET IsValid = 0 WHERE
t1.ID NOT in (SELECT MAX(t2.ID) FROM phone t2 GROUP BY t2.PHONENO);

答案 2 :(得分:1)

假设TAB为您的表名:

UPDATE  TAB
SET     TAB.ISVALID = 0
WHERE   TAB.ID NOT IN(SELECT MAX(ID) ID FROM TAB GROUP BY PHONENO)

答案 3 :(得分:1)

它只是上面的答案,但有完整的代码。

CREATE TABLE Sample1 (
id INT IDENTITY(1,1)
,phoneNo INT
,IsValid BIT)
GO

INSERT INTO Sample1 VALUES(011,1)
INSERT INTO Sample1 VALUES(011,1)
INSERT INTO Sample1 VALUES(022,1)
INSERT INTO Sample1 VALUES(022,1)
INSERT INTO Sample1 VALUES(033,1)
INSERT INTO Sample1 VALUES(011,1)

SELECT* FROM Sample1
GO

UPDATE Sample1 SET IsValid=0 WHERE id NOT IN (SELECT MAX(id) FROM Sample1 GROUP BY phoneNo)
GO

DROP TABLE Sample1
GO