【问题标题】:DB2 - REPLACE INTO SELECT from tableDB2 - 从表中替换为 SELECT
【发布时间】:2015-05-20 18:23:43
【问题描述】:

在 db2 中有没有一种方法可以用同一张表中的选定行替换整个表?

类似 REPLACE into tableName select * from tableName where col1='a';
(我可以导出选定的行,删除整个表并再次加载/导入,但我想避免这些步骤并使用单个查询)。

原始表
col1 col2
a 0 一个 1 b 2
c 3

所需的结果表
col1 col2
0
一个 1

任何帮助表示赞赏!
谢谢。

【问题讨论】:

  • 你为什么不能直接DELETE FROM mytbl WHERE COL1 <>'a'
  • 该表包含很多列,它只会使查询变得很长。由于有一个替换关键字,我想知道该删除方法是否有解决方法。
  • 我不明白。列数与什么有什么关系?如果您在 WHERE 子句中谈论比较次数,则无论您保留所需的行还是删除不想要的行,您都必须执行相同的次数。添加了一个代码示例的答案..

标签: select replace db2


【解决方案1】:

这是我对您duplicate question 的回答的副本:

您无法一步完成。截断表所需的锁定会阻止您同时查询表。

最好的选择是声明一个全局临时表 (DGTT) 并将所需的行插入其中,截断源表,然后将 DGTT 中的行重新插入源表。比如:

declare global temporary table t1 
   as (select * from schema.tableName where ...) 
   with no data
   on commit preserve rows
   not logged;

insert into session.t1 select * from schema.tableName;

truncate table schema.tableName immediate;

 insert into schema.tableName select * from session.t1;

【讨论】:

    【解决方案2】:

    我知道无法一步完成您的要求...

    你必须选择一个临时表然后复制回来。

    但我不明白你为什么首先需要这样做。让我们假设有一个 REPLACE TABLE 命令...

    REPLACE TABLE mytbl WITH (
      SELECT * FROM mytbl
      WHERE col1 = 'a' AND <...>
    )
    

    为什么不简单地删除反向行集...

    DELETE FROM mytbl
    WHERE NOT (col1 = 'a' AND <...>)
    

    请注意,WHERE 子句中的比较完全相同。您只需将它们包装在 NOT ( ) 中即可删除您不想保留的那些。

    【讨论】:

      猜你喜欢
      • 2018-06-10
      • 1970-01-01
      • 1970-01-01
      • 2013-09-09
      • 2021-04-23
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多