oracle 按一个ID的新条目

ercv8c1e  于 2022-12-03  发布在  Oracle
关注(0)|答案(1)|浏览(131)

有一个table1,其字段为call_id, param0, param1, param2, ...param30。参数字段取值 从1到100。
还有第二个表table2,其中包含我需要从第一个表中填写的字段call_id, theme_code。任务的复杂性在于,对于一个call_id,我需要将其中的每个param作为theme_code,如果其中一个param为空,则不需要为call_id创建新记录
示例:表1:

callid   | par0 | par1 | par2 | par3 | par4 | par5 | par6 | par7 | par8 | par9 | par10 |
-------------------------------------------------------------------------------------------
    
    1234567  | 24   | 2    | null | 91   | 58   | null | 25   | 19   | 77   | 62   | null  |

表2:

callid   |  theme_code  |
------------------------
1234567  |  24          |
------------------------
1234567  |   2          |
------------------------
1234567  |  91          |
------------------------
1234567  |  58          |
------------------------
1234567  |  25          |
------------------------
1234567  |  19          |
------------------------
1234567  |  77          |
------------------------
1234567  |  62          |
xxhby3vn

xxhby3vn1#

您似乎只想将table1中的列反透视到多行中:

select callid, theme_code
from table1
unpivot (
  theme_code
  for par in (par0, par1, par2, par3, par4, par5, par6, par7, par8, par9, par10)
)

| 呼叫ID|主题代码|
| - -|- -|
| 小行星1234567|二十四|
| 小行星1234567| 2个|
| 小行星1234567|九十一|
| 小行星1234567|五十八|
| 小行星1234567|二十五个|
| 小行星1234567|十九|
| 小行星1234567|七十七|
| 小行星1234567|六十二|
fiddle
您可以阅读更多关于透视和取消透视in this article的内容。
除非table1是某种类型的临时表,否则将数据复制到table2将违反规范化原则,您最好在需要时使用该查询,或者基于该查询创建一个视图(可能是一个物化视图)。
如果确实要将未透视的数据放入另一个表中,则可以使用该查询作为insertmerge语句的基础。

相关问题