Sql 对重复项重新编号以使其唯一
Sql 对重复项重新编号以使其唯一,sql,postgresql,postgresql-8.2,Sql,Postgresql,Postgresql 8.2,codigo列虽然是文本类型,但其数字序列 复制品。网格列是唯一的序列 Table "public.t" Column | Type | Modifiers --------+---------+----------- code | text | grid | integer | 目标是消除code列中的重复项,使其唯一。结果应类似于: select * from t order by grid; code | grid ------+------
codigo
列虽然是文本类型,但其数字序列
复制品。网格列是唯一的序列
Table "public.t"
Column | Type | Modifiers
--------+---------+-----------
code | text |
grid | integer |
目标是消除code
列中的重复项,使其唯一。结果应类似于:
select * from t order by grid;
code | grid
------+------
1 | 1
1 | 2
1 | 3
2 | 4
2 | 5
2 | 6
3 | 7
版本为8.2(无窗口功能)
这就是有效的解决方案
create table t (code text, grid integer);
insert into t values
('1',1),
('1',2),
('1',3),
('2',4),
('2',6),
('3',7),
('2',5);
问题是必须重复update
命令,直到不再重复。这只是一个“它不是完美的”问题,因为它只是一个一次性操作。导出(并删除)除code
列以外的所有内容(也许您可以子查询导出,并删除重复的行)。使code
primary具有自动递增行为并重新导入所有内容<代码>代码列应自动生成
create table t (code text, grid integer);
insert into t values
('1',1),
('1',2),
('1',3),
('2',4),
('2',6),
('3',7),
('2',5);
drop sequence if exists s;
create temporary sequence s;
select setval('s', (select max(cast(code as integer)) m from t));
update t
set code = i
from (
select code, grid, nextval('s') i
from (
select code, max(grid) grid
from t
group by code
having count(*) > 1
order by grid
) q
) s
where
t.code = s.code
and
t.grid = s.grid