【问题标题】:Inserting from a SELECT but changing one column in the middle?从 SELECT 插入但在中间更改一列?
【发布时间】:2019-08-31 18:09:24
【问题描述】:

想知道是否有一种方法可以将行从另一个表插入到另一个表中,中间的一列除外,而无需指定所有列名?我的表中有 128 列。

我创建了一个视图来存储原始记录。

CREATE VIEW V_TXN_STG AS
SELECT * FROM TXN_STG;

在表TXN_STG 中,只有一列BRN_CODE 发生变化。

这样的事情是行不通的,因为列不在最后,而是在表结构的中间。

INSERT INTO TXN_STG 
SELECT v.*, 'BRN-001' AS BRN_CODE 
FROM V_TXN_STG v;

【问题讨论】:

  • 我猜你需要使用 ALTER 列。

标签: oracle insert-select


【解决方案1】:

首先你必须得到列:

SELECT listagg(column_name, ',') within group (order by column_name) columns
FROM all_tab_columns
WHERE table_name = 'AAA' --Table to insert too
and column_name <> 'B' -- column name you want to exclude
GROUP BY table_name;

然后将该结果插入第一行:

insert into aaa(A,C) -- A,C is my result from above,I have excluded column B
select * 
from (select 'a' A,'q' AMOUNT,'c' C from dual union all -- my sample data
select 'a','a','c'  from dual union all
select 'a','b','c'  from dual union all
select 'a','c','c' from dual union all
select 'a','d','c'  from dual ) 
pivot
( 
  max(1)   
  for (AMOUNT) -- the column you want to remove from the sample data
  IN ()
) 
where 1=1 
order by A;

【讨论】:

  • 您好 W_O_L_F,我无法获得您使用示例数据编写的部分。首先,您使用 listagg 使列看起来不错,但是数据呢?从现有列中选择值并向排除列提供新值的脚本在哪里?
  • 这部分:select 'a' A,'q' AMOUNT,'c' C from dual union all -- 我的样本数据 select 'a','a','c' from dual union all select 'a','b','c' from dual union all select 'a','c','c' from dual union all select 'a','d','c' from dual 只是一个用你想读取的表格替换它是如何工作的。
【解决方案2】:

如果不明确指定您的选择中的列,我认为这是不可能的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    • 1970-01-01
    • 1970-01-01
    • 2019-06-12
    • 1970-01-01
    • 1970-01-01
    • 2020-06-02
    相关资源
    最近更新 更多