【问题标题】:Introduce a sequence in descent order按下降顺序引入一个序列
【发布时间】:2022-01-25 18:57:31
【问题描述】:

我创建了一个序列,我应该按表顺序按下降顺序按其他列引入该序列。

我创建的这个序列是这样的:

CREATE SEQUENCE seq_athlete_id 
INCREMENT BY 1 
START WITH 1001 
NO CYCLE 
OWNED BY tb_athlete.id;

我分配给这张桌子:

CREATE TABLE olympic.tb_athlete    (
  id CHARACTER INTEGER NOT NULL,
  athlete_id    CHARACTER(7) NOT NULL,
  name          CHARACTER VARYING(50) NOT NULL,
  country       CHARACTER VARYING(3) NOT NULL,
  substitute_id  CHARACTER(7) DEFAULT NULL,
  CONSTRAINT pk_athlete PRIMARY KEY (athlete_id),
  CONSTRAINT fk_athlete_substitute FOREIGN KEY (substitute_id) REFERENCES olympic.tb_athlete (athlete_id)
);

然后我尝试用这段代码进行介绍:

SELECT setval('seq_athlete_id'::text,
               (SELECT athlete_id 
                 FROM tb_athlete 
                 ORDER BY athlete_id DESC)::bigint);

但是返回错误“一个子查询返回多行作为表达式”。

因为我需要引入与运动员id相反的id顺序,也就是说,运动员id应该从最大值到最小值,id从最小值到最大值。

如何引入应用此序列的顺序?

【问题讨论】:

  • 您的意思不是从 1001 开始序列,而是希望从 tb_athlete 表中的最大值 athlete_id 开始?
  • 是的,你是对的。目标是按运动员id这一列的下降顺序排列
  • 可以通过在子查询末尾添加`LIMIT 1`来解决“返回多行...”(请参阅​​:LIMIT

标签: postgresql sequence


【解决方案1】:

你可以定义你的sequence,所以 nextval() 每次返回一个较低的下一个值:

CREATE SEQUENCE seq_athlete_id 
INCREMENT BY -1 
START WITH 1001 
MAXVALUE 1001 
NO CYCLE ;

现在选择 nextval() 将给出:

select nextval('seq_athlete_id');

 nextval
---------
    1001

(1 row)

select nextval('seq_athlete_id');

 nextval
---------
    1000

(1 row)

select nextval('seq_athlete_id');

 nextval
---------
     999

(1 row)

【讨论】:

  • 但我需要从 1001 开始并增加它。我的主要问题是从下降顺序中更多的运动员 ID 开始。
  • 我不是以英语为母语的人,并且将“下降”与“下降”混淆(对不起!)。但是你能解释一下“下降顺序”是怎样的吗?
  • 是的,别担心。列 player_id 具有 char(7) 的值,我需要此列的顺序以分配此序列,如下所示 1281372-> 1281209 ->1280365-> ...
  • 我想我需要删除我的答案。你能edit这个问题吗,并提供表tb_athlete的定义,以及你需要什么的描述。序列用于确定 new athlete_id,运动员的排序应在您的 sql 语句中使用 ORDER BY 完成。 (ORDER BY 决定了显示运动员的顺序)。
  • 我已经编辑以更好地解释我的问题。因为正如您所提到的,在引入 setvalue 的那一刻,我尝试 ORDER BY athlete_id DESC 但出现此错误“用作表达式的子查询返回的不止一行”。
【解决方案2】:

至少我可以用这个代码得到一个解决方案:

UPDATE tb_athlete SET id = nextval('seq_athlete_id') 
FROM (SELECT athlete_id FROM tb_athlete ORDER BY athlete_id DESC) sub
WHERE tb_athlete.athlete_id = sub.athlete_id;

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多