我想编写从更新语句到合并合并语句的动态查询

Posted

技术标签:

【中文标题】我想编写从更新语句到合并合并语句的动态查询【英文标题】:I want to write dynamic query from update statement to merge merge statement 【发布时间】:2019-07-29 08:10:56 【问题描述】:

    'UPDATE ' || T1_TABLENAME || ' t1 ' || 'SET ( ' ||
             v_t1_fields || ' ) =  (SELECT ' || v_t2_fields || ' FROM ' ||
             T2_TEMPTABLE_NAME || ' tmp WHERE ' || v_con || ' ) ' ||
             ' WHERE EXISTS ( SELECT 1 FROM ' ||  T2_TEMPTABLE_NAME ||
             ' tmp WHERE ' || v_con || ' )';

           --  HERE v_con = t1.D=t2.D,
               v_t1_fields-it can store dynamically-A,B,C
               v_t2_fields-it can store dynamically-A,B,C

------------

    MERGE INTO TABLE1 t1
USING TABLE2 t2 
ON(t1.D=t2.D)
WHEN MATCHED THEN
  UPDATE 
   SET 
   t1.A=t2.A,
   t1.B=t2.B,  //update set (t1.A,t1.B,t1.C =t2.A,t2.B,t2.C) not work 
   t1.C=t2.C;


 ------------------  

    'MERGE INTO ' TABLE1 || ' t1 ' ||
' USING ' TABLE2 || ' t2 ' ||
' ON ( '  || v_cons || ' )   
 when matched then update set ('
  || v_t1_fields || ') = '( || v_t2_fields || ' );'  // Its not work--ORA-01747: invalid user.table.column, table.column, or column specification

然后我使用 reg_exp 来拆分列

  ---------------------------

    v_Sql :=  'MERGE INTO ' TABLE1 || ' t1 ' ||
' USING ' TABLE2 || ' t2 ' ||
' ON ( '  || v_cons || ' )   
 when matched then update set ('
                ( ' || regexp_substr(v_t1_fields, '[^,]+', 1, 1) || ' ) = ( ' || regexp_substr(v_t2_fields, '[^,]+', 1, 1) || ' )
                ( ' || regexp_substr(v_t1_fields, '[^,]+', 1, 2) || ' ) = ( ' || regexp_substr(v_t2_fields, '[^,]+', 1, 2) || ' )
                ( ' || regexp_substr(v_t1_fields, '[^,]+', 1,3)  || ' ) = ( ' || regexp_substr(v_t2_fields, '[^,]+', 1,3) || ' ) ';

这个也不起作用 ----ORA-01747: 无效的 user.table.column、table.column 或列规范 动态更新到动态合并 同时使用更新语句更改合并 不工作

【问题讨论】:

似乎是连接语法中的错误 - 不应该'MERGE INTO' TABLE1 || 't1' 写成'MERGE INTO' ||表1 || ' t1 ' 代替 - 在 TABLE1 之前有一个额外的 concat 运算符 你为什么要这样做?听起来像是一种糟糕的应用程序设计方法。 为了提高性能,更新 10 万条记录需要 10 分钟。所以我尝试使用合并 【参考方案1】:

MERGE 语句的连接和使用很少有错误。

尝试以下动态查询:

     'MERGE INTO '
     || TABLE1
     || ' t1 '
     || ' USING '
     || TABLE2
     || ' t2 '
     || ' ON ( '
     || V_CONS
     || ' ) when matched then update set '
     || REGEXP_SUBSTR(V_T1_FIELDS, '[^,]+', 1, 1)
     || ' = '
     || REGEXP_SUBSTR(V_T2_FIELDS, '[^,]+', 1, 1)
     || ', '
     || REGEXP_SUBSTR(V_T1_FIELDS, '[^,]+', 1, 2)
     || ' = '
     || REGEXP_SUBSTR(V_T2_FIELDS, '[^,]+', 1, 2)
     || ', '
     || REGEXP_SUBSTR(V_T1_FIELDS, '[^,]+', 1, 3)
     || ' = '
     || REGEXP_SUBSTR(V_T2_FIELDS, '[^,]+', 1, 3);

我假设

TABLE1TABLE2 是有效的表名 V_CONS 是表格上的有效条件 V_T1_FIELDSV_T2_FIELDS 包含表的有效列名

干杯!!

【讨论】:

以上是关于我想编写从更新语句到合并合并语句的动态查询的主要内容,如果未能解决你的问题,请参考以下文章

MySQL高级查询缓存合并表分区表

从字符串构建动态LINQ查询 - 使用Reflection?

合并 Select 语句并动态排序?

在 Java 中将动态 SQL 查询转换为准备好的语句

如何将这些 SQL SELECT 查询合并到一个 SELECT 语句中

sql语句拼接