我有一个名为PROF的表,我需要从中获取从x1..x20和y1..y20(共40列)中放置的某些代码,这些代码需要在另一个表CROSSREF表中检查以获取参考代码。这里的问题是这个CROSSREF表中有一对多的映射。
table PROF
---------
mem_id cl_id line_no x1..x20 y1..y20
table CROSSREF
--------------
refx refy
这里将x1与refx中的z1进行比较,并且refy字段中的参考值需要被拉出,其具有1对多的关系。
例如:
refx refy
----------
z1 -> a1
a3
a2
z2 -> a10
a50
所以这里对于表PROF的x1,我有a1,a2,a3代码。根据要求, a1移动到x1,a3移动到x2,a2移动到x3。并且需要填写直到x20 ..我想首先我必须通过查看CROSSREF表来提取值直到我可以容纳到x1..x20并且如果我不能容纳则将其余代码保留在PROF表中。
最终转型
x1 -> a1
x2 -> a3
x3 -> a2
x4 -> a10
x5 -> a20 and so on
我知道它太复杂了,我已经告诉过将CROSSREF更改为一对一映射的建议,但到目前为止要求没有改变。
答案 0 :(得分:0)
所以经过一番摆弄后,我想我找到了答案。假设我正确理解你的问题。
以下答案使用
答案 1 :(得分:0)
如果我理解正确,您希望将crossref表中的值移动到prof表中。如果是这样,您可以使用游标迭代crossref值并使用switch语句执行插入:
begin
for r_crossref in (select refx, refy from crossref) loop
case r_crossref.refx
when 'z1' insert into prof (x1) values (r_crossref.refy);
when 'z2' insert into prof (x2) values (r_crossref.refy);
...
end case;
end loop;
end;
/
commit;
根据所有者的反馈进行更新。如果我的假设是正确的,您需要为每个zN组插入一行到PROF表中并更新该对应行的所有xN值,因此下面的解决方案将起作用。不过,问题似乎有点奇怪,或者至少我们没有足够的信息。例如,如果CROSSREF表中有一个特定zN值的行超过20行,那么会发生什么......等等...
begin
for r_crossref_refx in (select distinct refx from crossref) loop
insert into prof(SOME_MEM_ID_BASED_ON_YOUR_BUSINESS_LOGIC, ...) values (...);
for r_crossref_refy in (select refy from crossref where refx = r_crossref_refx.refx) loop
case r_crossref.refy
when 'z1' update prof set x1 = r_crossref_refy.refy where mem_id = SOME_MEM_ID_BASED_ON_YOUR_BUSINESS_LOGIC;
when 'z2' update prof set x2 = r_crossref_refy.refy where mem_id = SOME_MEM_ID_BASED_ON_YOUR_BUSINESS_LOGIC;
...
end case;
end loop;
end loop;
end;
/
commit;
答案 2 :(得分:0)
使用嵌套表来存储refy的值与PROF表x1,x2,x20进行比较,然后删除refy值中的重复项(如果有的话)使用MULTISET,然后将值更新回x1,x2 .. PROF表的x20。
使用IMPLICIT游标,嵌套表,MULTISET - 组合每个集合并删除它们之间的重复项,并构建需要更新的最终集合,如最终转换中所示。
感谢帮助我这样做的朋友以及@Hawk和@EmilMoise