【发布时间】:2017-12-25 03:50:51
【问题描述】:
PL/SQL - 根据名称作为键将表 2 中的 ID 插入表 1 中,如果在 Oracle 中找不到名称,则可能重复并更新表 2。
我必须创建一个执行上述任务的存储过程
给定表 1:TEST1
Name | Data | ID |
Tim | Test1 | |
Jim | Test2 | |
Jim | Test3 | |
Roy | Test4 | |
Matt | Test5 | |
给定表 2:TEST2(ID 自动生成)
ID | Name |
23 | Tim |
24 | Jim |
20 | Matt |
需要结果表为:
Name | Data | ID |
Tim | Test1 | 23 |
Jim | Test2 | 24 |
Jim | Test3 | 24 |
Roy | Test4 | x |
Matt | Test5 | y |
如果在 TEST2 中找不到名称,则 x、y 是 Roy 和 Matt 新生成的 ID
我写了以下代码:
MERGE INTO TEST1 b
USING (
SELECT ID, NAME FROM TEST2) e
ON (b.NAME = e.NAME)
WHEN MATCHED THEN
UPDATE SET b.CODE = E.ID
WHEN NOT MATCHED THEN
INSERT (b.CODE)
VALUES ('NONE');
产生
Name | Data | ID |
Tim | Test1 | 23 |
Jim | Test2 | 24 |
Jim | Test3 | 24 |
Roy | Test4 | - |
Matt | Test5 | - |
我没有得到在 TEST2 中同时插入新行并获取数据的逻辑。
请帮忙!!
【问题讨论】:
-
表 TEST2 的新 ID 值是如何生成的?
-
这似乎是一个有缺陷的过程。您可能希望将第二个表中的 ID 列作为主键,并在第一个表中使用它。在这种情况下,您也不应该将名称存储在第一个表中。现在(假设您正在解决该问题):如果相同的名称在第二个表中出现多次怎么办?然后:首先您应该使用缺少的名称更新第二个表,然后使用 ID 更新第一个表。 “同时”是错误的想法;您必须分两步完成。在此期间,您需要锁定这两个表。
-
@krokodilko ID 是通过 TEST2 表中的 auto_increment 生成的
-
@mathguy 是的,我想你是对的......我需要另一个 SQL 来处理不匹配的情况......会继续挖掘。
-
@NishantPatel 你想将它实现为触发器还是 PL/SQL 程序? (我的意思是它是一次性任务,还是您想在每次插入时即时完成)。您想如何为 TEST2 表中未找到的行生成 ID?