【发布时间】:2021-03-18 08:19:02
【问题描述】:
假设我们有一个包含如下付款信息的 CSV 文件:
somthing1:500.00
somthing2:300.00
somthing3:200.00
我需要更新 Firebird 数据库中 tableB 中的不同行,该数据库有一个名为 paid 的列,其值位于 CSV 文件的第二列中。出于这个原因,我创建了一个全局临时表,只是为了将数据泵入其中,然后更新所需的表。我尝试的是这样的:
idd = 0
with open('file.csv', 'r', encoding='utf-8', newline='') as file:
reader = list(csv.reader(file, delimiter=':'))
for row in reader:
idd += 1
c.execute("""INSERT INTO temp_table (id,code,paid) VALUES (?,?,?)""",
(idd,str(row[0]),str(row[1]), ))
这按预期工作 - 表格已填充。之后我尝试像这样更新其他表:
c.execute("""select paid from temp_table;""")
res = c.fetchall()
for r in res:
c.execute(f"""UPDATE tableB SET paid = {r[0]} WHERE oid = 10;""")
这确实有效 - 对于来自 SELECT 查询的每个结果,它都会使用与该查询的下一个结果相同的值更新所有行。我尝试在数据库本身中使用 MERGE 得到相同的结果 - 每一行都使用来自 temp_table 的相同值进行更新:
MERGE INTO tableB b
USING (SELECT paid FROM temp_table) e
ON b.paid = 0 AND oid = 10
WHEN MATCHED THEN
UPDATE SET b.paid = e.paid;
我需要一些方法来更新来自tableB 的第一行与来自 CSV 的第一行等等。我错过了什么?
【问题讨论】: