我想做一个INSERT / SELECT,这意味着在TARGET_TABLE中插入SOURCE_TABLE的记录,并假设:
SOURCE和TARGET表只有一个普通列的SUBSET,这意味着在示例中:
==> SOURCE TABLE有ALPHA,BETA和GAMMA列;
==> TARGET TABLE有BETA,GAMMA和DELTA专栏。
生成INSERT / SELECT语句的最有效方法是什么,尊重源表中不存在所有目标列的假设?
这个想法是PL / SQL脚本CHECKS源表和目标表中的列,进行INTERSECTION,然后生成一个带有正确列列表的动态SQL。
请假设目标表中存在但不存在于源表中的列必须保留为NULL。
我希望将SOURCE中的数据提取到一组INSERT语句中,以便以后插入到TARGET表中。
您可以假设TARGET表的列数多于SOURCE表,并且SOURCE表中的所有列都以相同的顺序出现在TARGET表中。
提前感谢您提出有用的建议!
答案 0 :(得分:5)
在Oracle中,您可以使用此SQL查询获取公共列:
select column_name
from user_tab_columns
where table_name = 'TABLE_1'
intersect
select column_name
from user_tab_columns
where table_name = 'TABLE_2'
然后使用上述查询迭代游标,以生成以逗号分隔的列表,其中包含返回的所有值。将逗号分隔的字符串放入名为varchar2
的{{1}}变量中。然后,您可以:
common_fields