迫切需要有关转换逻辑的帮助

时间:2015-11-06 04:51:24

标签: sql oracle oracle11g oracle-sqldeveloper

我有一个名为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更改为一对一映射的建议,但到目前为止要求没有改变。

3 个答案:

答案 0 :(得分:0)

所以经过一番摆弄后,我想我找到了答案。假设我正确理解你的问题。

以下答案使用

  1. UNPIVOT :(在您标记的Oracle 11g中可用),以便将列x1,.. y20转换为行(40行)。
  2. WITH子句:为了加入这两个表。
  3. 由于没有用于连接这两个表的公共列,因此我使用了self.automaticallyAdjustsScrollViewInsets = NO;

    rownum

    此处FIDDLE

    前5行的结果:

    enter image description here

答案 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