如何从 csv 读取列并运行更新查询?

Posted

技术标签:

【中文标题】如何从 csv 读取列并运行更新查询?【英文标题】:How to read column from csv and run a update query? 【发布时间】:2020-05-11 20:19:38 【问题描述】:

我有一个包含 6000 行日期和 ID 号的 csv 文件。我正在使用 SQL Oracle Developer。我已将 CSV 文件上传到 Oracle。

CSV 文件表是table3。我想用以下查询更新table1。如table3(CSV 文件)中所述,有 6000 个T1_ID。我希望它通过 csv 文件并获取T1_ID 并更新table1

由于我的 CSV 文件中有很多日期,我想也许使用日期是获取T1_IDs 的更好选择。

update table1
set RESULT_CODE = 62
where T1_ID = ? 
CREATED_time >= ?
and CREATED_time <= ?

这是表 3 的示例:

【问题讨论】:

【参考方案1】:

您可以使用 MERGE 语句:

MERGE INTO TABLE1 t1
  USING (SELECT *
           FROM TABLE3) t3
    ON (t1.ID = t3.ID AND
        t3.CREATED_TIME BETWEEN TO_TIMESTAMP('01-APR-2020', 'DD-MON-YYYY')
                            AND TO_TIMESTAMP('02-MAY-2020', 'DD-MON-YYYY') - INTERVAL '0.000000001' SECOND)
  WHEN MATCHED THEN
    UPDATE SET t1.RESULT_CODE = 62;

【讨论】:

这是个好主意,但表 1 很大,我不想合并这些表。我只想使用更新查询并使用 CSV 和时间戳中的参考 ID。 MERGE 是 Oracle 对 upsert(组合更新和插入)操作的术语。这里不需要声明的“插入”部分,所以我只是把它省略了。我只是发现有时阅读和理解 MERGE 比带有子查询的 UPDATE 更容易。 嗯,有道理。所以这将更新并插入。对于时间戳。我想要它在我提供的时间戳之间。我将如何使它保持不变。【参考方案2】:

对我来说,它看起来像

update table1 a set
  a.result_code = 62
  where exists (select null 
                from table3 b
                where b.t1_id = a.t1_id
                  and b.created_time between to_timestamp('01.05.2020', 'dd.mm.yyyy')
                                         and to_timestamp('10.05.2020', 'dd.mm.yyyy')
               );

【讨论】:

为什么我们要从表 3 中选择 null 它返回的 what 并不重要; EXISTS 只对是否存在至少一个满足条件的行感兴趣。 创建时间也是两个表中相同的列和格式。我很困惑为什么有这个专栏。 ('10.05.2020', 'dd.mm.yyyy') 当我只想使用的时候。 那么你的例子没有意义。如果某事物 >= CREATED_DATE 并且 - 同时 - 等于 到 CREATED_DATE。基本上,我试图猜测你想要什么 - 老实说 - 你没有提供太多关于描述或所涉及表格内容的信息。 很抱歉。 > = 4 月 1 日和

以上是关于如何从 csv 读取列并运行更新查询?的主要内容,如果未能解决你的问题,请参考以下文章

如何在具有数百条记录的现有csv中添加新列并从数组中填充它?

如何使用bash脚本从csv文件中读取特定的整数?

如何从 Big Query cli 运行保存的查询并将结果导出到 CSV?

如何使用 Postgres 中 CSV 文件中的值更新选定的行?

如果列中的值小于特定值,如何转到csv文件中的特定列并打印整行

如何从数据库中读取值,例如 jmeter 中的 csv 文件