我需要将重复的记录更新为无效,但只保留记录。
我的表格结构如下:
字段名称
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,我该如何解决?
答案 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