【问题标题】:Copy record from one Oracle SQL table to another with extra columns使用额外的列将记录从一个 Oracle SQL 表复制到另一个
【发布时间】:2020-07-22 17:55:29
【问题描述】:

这是一个更大的 Java 程序的一部分,但我正在寻找一种在 Oracle SQL 中将记录从一个表复制到另一个表的方法。原始表为 45 列。第二个表是原表的存档表。

编辑 - 它有相同的 45 列,但也有一个 NewKey 列 - 在存档表中创建使用

("NEWKEY" NUMBER GENERATED ALWAYS as IDENTITY(START with 1 INCREMENT by 1)

还有一个 archive_date 列

"ARCHIVEDATE" DATE DEFAULT CURRENT_TIMESTAMP

有没有办法做一个查询

INSERT INTO Archive_Table A
SELECT * (plus NEWKEY, ARCHIVEDATE) FROM Original Table O
WHERE O.CUSTKEY = passed_param;

传递的唯一参数是 CUSTKEY?一旦从原始表中复制了一条记录,它将从原始表中删除。

【问题讨论】:

  • 您自己的测试结果如何?您需要列出各个列,并更改您的 WHERE 子句。不需要加入 (WHERE A.CUSTKEY = O.CUSTKEYI),只需 'where o.custkey = pass_parm.并且您需要添加一个条件来防止获取您在之前运行中获得的行。
  • 让我稍微编辑一下,看看是否更有意义。

标签: sql oracle copy


【解决方案1】:

ARCHIVEDATE 是一个日期字段,因此它应该默认为 SYSDATE,而不是 CURRENT_TIMESTAMP。这消除了每次插入的转换。

正如其他人所说,只需列出列:

insert into archivetable (custkey, cola, colb, colc) 
select custkey, cola, colb, colc 
  from originaltable 
 where custkey = passedparam;

无需包含 NEWKEY 或 ARCHIVEDATE,因为它们将在插入时被初始化。

【讨论】:

  • 谢谢你,布赖恩 - 这会有所帮助。我会看看他们是否会让我更改 ARCHIVEDATE 以使这更容易。
【解决方案2】:

如果您在半小时前(当您发布问题时)开始输入这 45 列,那么您的代码就已经启动并运行了。

无论如何:在select 中使用星号 (*) 可能不是最好的主意;为了什么?你期望什么好处?为了节省一些键盘敲击?因为,如果您明确命名所有列,您就确切地知道哪个值进入哪个列。如果在这两个表之一中添加一个新列怎么办? insert into select * 将不再起作用。

您可以通过查询user_tab_columns、编写insert into 语句、注意差异(身份和时间戳列)来使用一些动态SQL(因此,在PL/SQL 中)来完成您的要求。一旦你完成了编码和测试,正如我所说的 - 直接命名所有这些列将在 ages 之前完成。

如果我是你,我会这样做:命名所有 45 列。

【讨论】:

  • 谢谢小脚。我一直很欣赏 snark。
  • 可悲的是(对你来说),就是这样:)
猜你喜欢
  • 2021-07-08
  • 2020-05-28
  • 1970-01-01
  • 2017-07-14
  • 2019-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多