如何在 Oracle SQL Developer 中生成带有子查询的 INSERT 语句?

Posted

技术标签:

【中文标题】如何在 Oracle SQL Developer 中生成带有子查询的 INSERT 语句?【英文标题】:How to generate INSERT Statements with Subqueries in Oracle SQL Developer? 【发布时间】:2021-07-20 14:07:33 【问题描述】:

我需要将一些数据从环境 A 移动到环境 B。到目前为止,非常简单。但是有些列有 FK 约束,不幸的是,查找数据已经在环境 B 上并且有不同的 PK。幸运的是,我可以在其他独特的列上进行映射。因此我想知道 SQL Developer 是否有一个导出功能,它允许我用子查询替换某些列值。为了清楚起见,我正在寻找一个 SQL Developer Feature、Query 或类似的生成如下所示的 INSERT 语句:

INSERT INTO table_name(col1, col2, fkcol) 
VALUES('value', 'value', (SELECT id FROM lookup_table WHERE unique_value = 'unique'))

我最好的方法是尝试手动生成它们,如下所示:

SELECT 
    'INSERT INTO table_name(col1, col2, fkcol) '  
    || 'VALUES( '
    || (SELECT LISTAGG(col1, col2, 
'SELECT id FROM lookup_table 
WHERE unique_value = ''' || lookup_table.uniquevalue || '''', ', ') 
WITHIN GROUP(ORDER BY col1) 
FROM table_name INNER JOIN lookup_table ON table_name.fkcol = lookup_table.id)
    || ' );'
    FROM table_name;

这绝对是一种痛苦。您是否知道在不接近其他数据库的情况下实现这一目标的更好方法?

【问题讨论】:

将数据作为另一个表导入并使用您需要的映射做insert ... select 【参考方案1】:

简单地编写一个查询,使用两个表的join生成所需的数据(使用映射键)。

例如(参见下面的示例数据)这样的查询(将unique_value 映射到id):

select 
  tab.col1, tab.col2, lookup_table.id fkcol 
from tab
join lookup_table
on tab.fkcol = lookup_table.unique_value

      COL1 COL2        FKCOL
---------- ------ ----------
         1 value1         11
         2 value2         12

现在您可以使用 INSERT 格式的普通 SQL Developer 导出功能,这将产生以下脚本 - 如果您想将其传输到其他数据库或 直接插入 INSERT ... SELECT

Insert into TABLE_NAME (COL1,COL2,FKCOL) values ('1','value1','11');
Insert into TABLE_NAME (COL1,COL2,FKCOL) values ('2','value2','12');

样本数据

select * from tab;
      COL1 COL2   FKCOL  
---------- ------ -------
         1 value1 unique 
         2 value2 unique2
         
select * from  lookup_table       
       ID UNIQUE_
---------- -------
        11 unique 
        12 unique2

【讨论】:

以上是关于如何在 Oracle SQL Developer 中生成带有子查询的 INSERT 语句?的主要内容,如果未能解决你的问题,请参考以下文章

如何安装pl/sql developer

如何安装pl/sql developer

如何在 SQL Developer 中检查语法 Oracle 存储过程?

oracle 客户端 sql developer 如何修改jdk版本

如何在 Oracle SQL Developer 中查询数据库名称?

如何在 oracle sql developer 中运行存储过程?