下面是一个关于Postgres中的基本数据库查询的问题.

我创建了两个表,如下所示:

create table Prix (rank integer primary key, value bigint unique);
create table Pris (rank integer primary key, value bigint unique);

换句话说,排名和价值都必须是唯一的.

这两个表保存数据:

select * from Prix;
rank value
1 1229
2 1993
select * from Pris;
rank value
1 2719
2 3547

我想知道我应该应用的正确查询,这样表PRI将不变,表Prix将变为:

select * from Prix;
rank value
1 1229
2 1993
3 2719
4 3547

表Prix现在是合并的结果,并调整了排名字段.

我try 了一下这些查询(但失败了):

INSERT INTO Prix SELECT * FROM Pris ON CONFLICT DO NOTHING;

INSERT INTO Prix SELECT * FROM Pris ON CONFLICT(rank) SET rank=rank+10;

我明白为什么第一个查询不起作用了.

但第二种方法也不起作用.所以我一定是使用了错误的语法,或者做错了什么.

任何提示或相关信息将不胜感激.

推荐答案

这不会插入重复值.

而且,当多个实例运行查询时,您必须小心,否则该数字将产生错误

INSERT INTO Prix 
  SELECT 
  ROW_NUMBER() OVER(ORDER BY "rank") + ( SELECT MAX("rank") FROM Prix),
  "value"
  FROM Pris ON CONFLICT ("value") DO NOTHING;
INSERT 0 2
SELECT * FROM Prix
rank value
1 1229
2 1993
3 2719
4 3547
SELECT 4

fiddle

如果你没有重复的价值,这就足够了,

INSERT INTO Prix 
  SELECT 
  ROW_NUMBER() OVER(ORDER BY "rank") + ( SELECT MAX("rank") FROM Prix),
  "value"
  FROM Pris ON CONFLICT  DO NOTHING;
INSERT 0 2
SELECT * FROM Prix
rank value
1 1229
2 1993
3 2719
4 3547
SELECT 4

fiddle

Sql相关问答推荐

使用自动增量ID插入失败(无法将值空插入列ID)

获取家谱树中第一次出现的特定信息,然后停止

PostgreSQL:获取每家店铺收入最高的员工

无法找到正确的SQL查询需求

如何转换和汇总行数

从列的不同值创建列

是否可以为表中的所有列生成散列值?

改进的SQL子字符串提取

更改重复值的情况

每个分组最多 Select 最后 2 个值并并排显示它们

如何解释 SQL Server 中的 Foxpro 语法?

如何在第二个 INSERT 中使用第一个 INSERT 自动生成的 ID

避免在SQL中使用具有相同条件的多个子查询

SQL中如何转置表格 UNPIVOT是唯一的 Select 吗?

PostgreSQL如何将Unix纪元时间戳转换为日期时间并进行拼接

根据行号将列转置为没有任何id或键列的行

使用in和and运算符过滤记录的条件

如何 Select 一列具有最小值而另一列具有给定值的记录?

如何获得上个月和下个月之间的销售额差异

snowflake插入覆盖行为