首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在某些条件下将重复值设置为NULL

在某些条件下将重复值设置为NULL
EN

Stack Overflow用户
提问于 2018-08-23 09:17:44
回答 2查看 1.3K关注 0票数 0

我有一个相当大的SQL数据库(目前是SQLite3),只有一个关系:

代码语言:javascript
复制
CREATE TABLE sometable (
    `name` TEXT,
    `position` INTEGER
);

由于数据的性质,没有主键或约束,只有nameposition列上的非唯一索引。现在,我需要将name列设置为NULL,其中名称是重复的,但位置不是。重复的(name,position)对是可以的,不应更改。

在此之前:

代码语言:javascript
复制
name | position
-----+---------
a    | 5
a    | 5
b    | 7
b    | 8
c    | 6
c    | 7
c    | 7
d    | 6

之后:

代码语言:javascript
复制
name | position
-----+---------
a    | 5
a    | 5
NULL | 6
NULL | 7
NULL | 6
NULL | 7
NULL | 8
d    | 6

我可以保留的唯一行是名称/职位关联中不存在歧义的行。但是,必须保留重复的名称/位置对,只要该名称不与其他位置相关联。

我找不到合适的SQL语句来做到这一点。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-23 09:22:20

尝试使用关联子查询来检查给定名称是否应由NULL替换的更新。下面的子查询按名称聚合,然后检查是否有多个职位。如果是这样,则该名称将是更新的候选名称。

代码语言:javascript
复制
UPDATE sometable
SET name = NULL
WHERE EXISTS (SELECT name FROM sometable t2
              WHERE sometable.name = t2.name
              GROUP BY name
              HAVING COUNT(DISTINCT position) > 1);
票数 1
EN

Stack Overflow用户

发布于 2018-08-23 09:20:56

您可以将union allnot exists/exists结合使用:

代码语言:javascript
复制
select t.name, t.position 
from table t
where not exists (select 1 from table t1 where t1.name = t.name and t.position <> t1.position)
union all
select null, t.position 
from table t
where exists (select 1 from table t1 where t1.name = t.name and t.position <> t1.position);

因此,update版本将是:

代码语言:javascript
复制
update table t
     set t.name = null
where exists (select 1 from table t1 where t1.name = t.name and t1.position <> t.position);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51982296

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档