使用自动生成的值更新每一行
Update every row with auto-generated value
我有一个 table:
CREATE TABLE "person" (
"ID" NUMBER(38,0),
"NAME" VARCHAR2(50 CHAR)
)
数据:
id名称
1 莫妮卡
2 空
3 空
4 斯蒂芬
5 空
我需要使用值“person”和自动增量值(从 1 - person1、person2、person3 等)更新空值:
1 monica
2 person1
3 person2
4 stephan
5 person3
我应该使用什么 sql (oracle) 查询?
不需要解析函数。更新可以像这样简单地完成:
UPDATE person
SET NAME = 'person' || ROWNUM
WHERE name IS NULL;
更新
由于人号需要和人的ID连续,所以可以用这个查询:
UPDATE person p
SET p.name =
'person'
|| (SELECT person_number
FROM (SELECT p2.id, ROW_NUMBER () OVER (ORDER BY p2.id) AS person_number
FROM person p2
WHERE name IS NULL)
WHERE id = p.id)
WHERE p.name IS NULL;
您实际上有 2 个问题,尽管您的问题只解决了其中 1 个。你不仅要'fix the data'还要'fix the system'。第二个(未解决的)是最重要的。有 2 个方法,让我们调用它们
- 正确的方法
-- update existing data
update person1
set name = 'PERSON' || to_char(rownum,'FM999')
where id is null;
-- fix the system
alter table person modify name not null;
- band-aid 方法
-- prepare for long term bandaid
create sequence unknown_person_seq;
-- update existing data
update person
set name = 'PERSON' || to_char(unknown_person_seq.nextval, 'FM99')
where name is null;
select * from person2;
-- adjust the system
alter table person modify name default 'Person' || to_char(unknown_person_seq.nextval, 'FM99');
不同之处在于正确的方法可以防止系统进一步损坏数据。参见 demo here。为无效数据引发异常比允许或生成虚假数据要好得多。假设您的 Person table 持有客户信息,您将他们称为 PERSON4。他们将成为您的客户多长时间?
有效:
SET
name = (
SELECT n
FROM(
SELECT
id, 'person' || ROW_NUMBER() OVER (ORDER BY id) AS n
FROM
person
WHERE
name IS NULL
)u
WHERE
u.id = person.id)
WHERE
NAME IS NULL
我有一个 table:
CREATE TABLE "person" (
"ID" NUMBER(38,0),
"NAME" VARCHAR2(50 CHAR)
)
数据:
id名称 1 莫妮卡 2 空 3 空 4 斯蒂芬 5 空
我需要使用值“person”和自动增量值(从 1 - person1、person2、person3 等)更新空值:
1 monica
2 person1
3 person2
4 stephan
5 person3
我应该使用什么 sql (oracle) 查询?
不需要解析函数。更新可以像这样简单地完成:
UPDATE person
SET NAME = 'person' || ROWNUM
WHERE name IS NULL;
更新
由于人号需要和人的ID连续,所以可以用这个查询:
UPDATE person p
SET p.name =
'person'
|| (SELECT person_number
FROM (SELECT p2.id, ROW_NUMBER () OVER (ORDER BY p2.id) AS person_number
FROM person p2
WHERE name IS NULL)
WHERE id = p.id)
WHERE p.name IS NULL;
您实际上有 2 个问题,尽管您的问题只解决了其中 1 个。你不仅要'fix the data'还要'fix the system'。第二个(未解决的)是最重要的。有 2 个方法,让我们调用它们
- 正确的方法
-- update existing data
update person1
set name = 'PERSON' || to_char(rownum,'FM999')
where id is null;
-- fix the system
alter table person modify name not null;
- band-aid 方法
-- prepare for long term bandaid
create sequence unknown_person_seq;
-- update existing data
update person
set name = 'PERSON' || to_char(unknown_person_seq.nextval, 'FM99')
where name is null;
select * from person2;
-- adjust the system
alter table person modify name default 'Person' || to_char(unknown_person_seq.nextval, 'FM99');
不同之处在于正确的方法可以防止系统进一步损坏数据。参见 demo here。为无效数据引发异常比允许或生成虚假数据要好得多。假设您的 Person table 持有客户信息,您将他们称为 PERSON4。他们将成为您的客户多长时间?
有效:
SET
name = (
SELECT n
FROM(
SELECT
id, 'person' || ROW_NUMBER() OVER (ORDER BY id) AS n
FROM
person
WHERE
name IS NULL
)u
WHERE
u.id = person.id)
WHERE
NAME IS NULL