我有一个要求,有两个表a和b。有一个名为id的列,它是表a的主键和表b的外键,其中表之间有一对多关系。在表a的id列中,我们有条目1、2、3,对于它们,我们有一个id对应的多个条目,在表b的另一列中,我们为其中的条目创建了序列。现在对于id 1的条目,我在表b中有3个条目,带有seq 1,2,3,但是当新的id条目出现时,我需要再次从该id的1开始排序。**您能帮我这样做吗。表a
krugob8w1#
我建议你不要把这些东西存放起来 SEQ 价值观。你为什么要这么做?无论何时需要都很容易计算。怎样?像这样,使用 row_number 分析函数:
SEQ
row_number
SQL> with b (id, name) as 2 (select 1, 'TRI' from dual union all 3 select 1, 'TRI' from dual union all 4 select 1, 'TRI' from dual union all 5 select 2, 'ROHIT' from dual union all 6 select 2, 'ROHIT' from dual union all 7 select 3, 'RAVI' from dual 8 ) 9 select id, 10 name, 11 row_number() over (partition by id order by null) seq 12 from b; ID NAME SEQ---------- ----- ---------- 1 TRI 1 1 TRI 2 1 TRI 3 2 ROHIT 1 2 ROHIT 2 3 RAVI 16 rows selected.SQL>
SQL> with b (id, name) as
2 (select 1, 'TRI' from dual union all
3 select 1, 'TRI' from dual union all
4 select 1, 'TRI' from dual union all
5 select 2, 'ROHIT' from dual union all
6 select 2, 'ROHIT' from dual union all
7 select 3, 'RAVI' from dual
8 )
9 select id,
10 name,
11 row_number() over (partition by id order by null) seq
12 from b;
ID NAME SEQ
---------- ----- ----------
1 TRI 1
1 TRI 2
1 TRI 3
2 ROHIT 1
2 ROHIT 2
3 RAVI 1
6 rows selected.
SQL>
如果你还想储存它,现在你知道怎么储存了。
5n0oy7gb2#
没有多个序列。只需在b表中使用一个序列,并接受每个序列都有间隙 ID 如果需要顺序值,可以根据需要使用 ROW_NUMBER() 分析函数,如果需要的话,把它放到一个视图中。另外,不要从表中复制名称 A 在表中 B ; 保持数据正常化。
ID
ROW_NUMBER()
A
B
CREATE TABLE A ( id NUMBER(8,0) GENERATED ALWAYS AS IDENTITY CONSTRAINT A__id__pk PRIMARY KEY, name VARCHAR2(20));CREATE TABLE B ( id NUMBER(8,0) CONSTRAINT B__id__nn NOT NULL CONSTRAINT B__id__fk REFERENCES A(id), seq NUMBER(8,0) GENERATED ALWAYS AS IDENTITY CONSTRAINT B__seq__pk PRIMARY KEY);
CREATE TABLE A (
id NUMBER(8,0)
GENERATED ALWAYS AS IDENTITY
CONSTRAINT A__id__pk PRIMARY KEY,
name VARCHAR2(20)
);
CREATE TABLE B (
CONSTRAINT B__id__nn NOT NULL
CONSTRAINT B__id__fk REFERENCES A(id),
seq NUMBER(8,0)
CONSTRAINT B__seq__pk PRIMARY KEY
然后可以创建示例数据:
INSERT INTO A ( name )SELECT 'TRI' FROM DUAL UNION ALLSELECT 'ROHIT' FROM DUAL UNION ALLSELECT 'RAVI' FROM DUAL;INSERT INTO B ( id )SELECT 1 FROM DUAL UNION ALLSELECT 1 FROM DUAL UNION ALLSELECT 2 FROM DUAL UNION ALLSELECT 3 FROM DUAL UNION ALLSELECT 2 FROM DUAL UNION ALLSELECT 1 FROM DUAL;
INSERT INTO A ( name )
SELECT 'TRI' FROM DUAL UNION ALL
SELECT 'ROHIT' FROM DUAL UNION ALL
SELECT 'RAVI' FROM DUAL;
INSERT INTO B ( id )
SELECT 1 FROM DUAL UNION ALL
SELECT 2 FROM DUAL UNION ALL
SELECT 3 FROM DUAL UNION ALL
SELECT 1 FROM DUAL;
以及:
SELECT *FROM B
SELECT *
FROM B
输出:
ID | SEQ-: | --: 1 | 1 1 | 2 2 | 3 3 | 4 2 | 5 1 | 6
ID | SEQ
-: | --:
1 | 1
1 | 2
2 | 3
3 | 4
2 | 5
1 | 6
如果需要输出,请创建一个视图:
CREATE VIEW B_view ( id, name, seq ) ASSELECT b.id, a.name, ROW_NUMBER() OVER ( PARTITION BY b.id ORDER BY seq )FROM B INNER JOIN A ON ( B.id = A.id )
CREATE VIEW B_view ( id, name, seq ) AS
SELECT b.id,
a.name,
ROW_NUMBER() OVER ( PARTITION BY b.id ORDER BY seq )
INNER JOIN A
ON ( B.id = A.id )
然后:
SELECT *FROM b_view
FROM b_view
ID | NAME | SEQ-: | :---- | --: 1 | TRI | 1 1 | TRI | 2 1 | TRI | 3 2 | ROHIT | 1 2 | ROHIT | 2 3 | RAVI | 1
ID | NAME | SEQ
-: | :---- | --:
1 | TRI | 1
1 | TRI | 2
1 | TRI | 3
2 | ROHIT | 1
2 | ROHIT | 2
3 | RAVI | 1
db<>在这里摆弄
2条答案
按热度按时间krugob8w1#
我建议你不要把这些东西存放起来
SEQ
价值观。你为什么要这么做?无论何时需要都很容易计算。怎样?像这样,使用row_number
分析函数:如果你还想储存它,现在你知道怎么储存了。
5n0oy7gb2#
没有多个序列。只需在b表中使用一个序列,并接受每个序列都有间隙
ID
如果需要顺序值,可以根据需要使用ROW_NUMBER()
分析函数,如果需要的话,把它放到一个视图中。另外,不要从表中复制名称A
在表中B
; 保持数据正常化。然后可以创建示例数据:
以及:
输出:
如果需要输出,请创建一个视图:
然后:
输出:
db<>在这里摆弄