如何在没有游标的情况下循环遍历表- oracle sql developer

r8uurelv  于 2023-10-16  发布在  Oracle
关注(0)|答案(1)|浏览(129)

我想遍历一个表,并将一个列值插入到另一个表中。我怎么能在没有光标的情况下执行此操作。

CREATE TABLE Status (Id, StatusCode, Description) AS
SELECT 11, 'CO', 'Completed' FROM DUAL UNION ALL
SELECT 22, 'CA', 'Carried' FROM DUAL UNION ALL
SELECT 33, 'AA', 'Carried' FROM DUAL;

另一个表表2

CREATE TABLE MainTable (Id, StatusTableId, MainTableData)

Maintable中,我需要获取三行数据:
| ID|斯塔斯塔布莱德|预订ID|可维护数据|
| --|--|--|--|
| 1 | 11 | 1 |安社会|
| 2 | 22 | 1 |达泽|
| 3 | 33 | 1 |阿达什德|
在这里,我想遍历status表,并将id(这里是11,22,33)插入到新表中。我可以在没有光标的情况下这样做吗?

y3bcpkx1

y3bcpkx11#

假设您已经创建了表格并插入了已知数据:

CREATE TABLE Status (Id, StatusCode, Description) AS
SELECT 11, 'CO', 'Completed' FROM DUAL UNION ALL
SELECT 22, 'CA', 'Carried' FROM DUAL UNION ALL
SELECT 33, 'AA', 'Carried' FROM DUAL;

CREATE TABLE MainTable (Id NUMBER, StatusTableId NUMBER, MainTableData VARCHAR2(10));

INSERT INTO maintable (id, maintabledata)
  SELECT 1, 'ancsd' FROM DUAL UNION ALL
  SELECT 2, 'dadsa' FROM DUAL UNION ALL
  SELECT 3, 'adasd' FROM DUAL;

然后,您需要为maintable中的每一行引用status中的id;但是,这两个表之间没有任何共同之处,因此您必须生成自己的方法来关联这两个表。
第一件事需要做的是找出这两个表是如何链接的(为什么maintable中的id1的行想要拥有11的状态?),然后,当你理解了为什么id应该有statusid的原因,然后可以实现这个逻辑来更新值。然而,由于逻辑并不明显,我们只能提供可能的猜测,给予预期的输出(但可能只是巧合)。
例如,您可以根据id列的顺序对Status中的行进行编号,然后将其与maintableid列相关联,并使用MERGE语句来更新表:

MERGE INTO maintable m
USING (
  SELECT id,
         ROW_NUMBER() OVER (ORDER BY id) AS rn
  FROM   status
) s
ON (m.id = s.rn)
WHEN MATCHED THEN
  UPDATE
  SET statustableid = s.id;

那么maintable包含:
| ID|法定|维护数据|
| --|--|--|
| 1 | 11 |安社会|
| 2 | 22 |达泽|
| 3 | 33 |阿达什德|
还有许多其他方法可以将这两个表关联起来;例如mainTable.IdStatus.Id的第一个字符:

MERGE INTO maintable m
USING status s
ON (m.id = SUBSTR(s.id, 1, 1))
WHEN MATCHED THEN
  UPDATE
  SET statustableid = s.id;

不过,回答你的问题:
我可以在没有光标的情况下这样做吗?
正如上文所述,你可以。
fiddle

相关问题