如何创建INSERT查询,将一个表中的序列号添加到另一个表中

问题描述 投票:3回答:1

我在Postgres 10.7数据库中有一张表sample_1,其中有一些纵向研究数据和每个sequence上升的key数。我需要来自临时表(INSERT)的sample_2数据,相应地维护sequence列。

sequence数字基于0。我假设我需要一个查询来查找sequence中每个key的最大sample_1数,并将其添加到每个新行的后续序列号中。我主要是在序列号算术的这一步中挣扎。试过这个:

INSERT INTO sample_1 (KEY, SEQUENCE, DATA)
SELECT KEY, sample_2.SEQUENCE + max(sample_1.SEQUENCE), DATA
FROM sample_2;

但是,我收到错误,说我不能在第2行使用'sample_1.SEQUENCE',因为这是插入的表。我无法弄清楚如何使用插入序列进行算术运算!

样本数据:

sample_1

| KEY         | SEQUENCE | DATA |
+-------------+----------+------+
| YMH_0001_XX |     0    |  a   |
| YMH_0001_XX |     1    |  b   |
| YMH_0002_YY |     0    |  c   |
sample_2

| KEY         | SEQUENCE | DATA |
+-------------+----------+------+
| YMH_0001_XX |     1    |  d   |
| YMH_0002_YY |     1    |  e   |
| YMH_0002_YY |     2    |  f   |

我想继续提升sequence数字每key插入行。

需要明确的是,此示例中的结果表将是3列和6行,如下所示:

sample_1

| KEY         | SEQUENCE | DATA |
+-------------+----------+------+
| YMH_0001_XX |     0    |  a   |
| YMH_0001_XX |     1    |  b   |
| YMH_0001_XX |     2    |  d   |
| YMH_0002_YY |     0    |  c   |
| YMH_0002_YY |     1    |  e   |
| YMH_0002_YY |     2    |  f   |
sql postgresql sequence greatest-n-per-group
1个回答
1
投票

这应该做你想做的事情:

INSERT INTO sample_1 (key, sequence, data)
SELECT s2.key
     , COALESCE(s1.seq_base, -1)
     + row_number() OVER (PARTITION BY s2.key ORDER BY s2.sequence)
     , s2.data
FROM   sample_2 s2
LEFT   JOIN (
   SELECT key, max(sequence) AS seq_base
   FROM   sample_1
   GROUP  BY 1
   ) s1 USING (key);
Notes
  • 你需要建立在sequencekey现有的最大sample_1。 (我把它命名为seq_base。)在子查询中计算并加入它。
  • 如图所示,添加row_number()。这保留了输入行的顺序,丢弃了绝对数字。
  • 我们需要LEFTJOIN来避免使用来自sample_2的新密钥丢失行。 同样,我们需要COALESCE为新密钥启动一个新序列。默认为-1,以在添加基于1的行号后有效地启动序列0。
  • 这对于并发执行并不安全,但我认为这不是你的用例。
© www.soinside.com 2019 - 2024. All rights reserved.