如何从 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_ID
s 的更好选择。
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中添加新列并从数组中填充它?
如何从 Big Query cli 运行保存的查询并将结果导出到 CSV?
如何使用 Postgres 中 CSV 文件中的值更新选定的行?