cav*_*rac 0 sqlite join sql-update pandas
我已经尝试过下面的答案,但我找不到正确的方法
问题就在这里。我有一个带有两个表的 sqlite 数据库。在下面的代码中,我使用 pandas 插入一些虚拟值
import sqlite3
import pandas
conn = sqlite3.connect('foo.db')
curs = conn.cursor()
df1 = pandas.DataFrame([{'A' : 1, 'B' : 'a', 'C' : None}, {'A' : 1, 'B' : 'b', 'C' : None}, {'A' : 2, 'B' : 'c', 'C' : None}])
df1.to_sql('table1', conn, index = False)
df2 = pandas.DataFrame([{'A' : 1, 'D' : 'x'}, {'A' : 2, 'D' : 'y'}])
df2.to_sql('table2', conn, index = False)
Run Code Online (Sandbox Code Playgroud)
这会产生两个表
pandas.read_sql('select * from table1', conn)
A B C
0 1 a None
1 1 b None
2 2 c None
Run Code Online (Sandbox Code Playgroud)
和
pandas.read_sql('select * from table2', conn)
A D
0 1 x
1 2 y
Run Code Online (Sandbox Code Playgroud)
现在我想在列上连接这两个表并用结果A更新列table1.CD
这是我尝试过的
上面列表中的解决方案 1
sql = """
replace into table1 (C)
select table2.D
from table2
inner join table1 on table1.A = table2.A
"""
curs.executescript(sql)
conn.commit()
pandas.read_sql('select * from table1', conn)
A B C
0 1.0 a None
1 1.0 b None
2 2.0 c None
3 NaN None x
4 NaN None x
5 NaN None y
Run Code Online (Sandbox Code Playgroud)
错误的
上面列表中的解决方案 2
sql = """
replace into table1 (C)
select sel.D from (
select table2.D as D
from table2
inner join table1 on table1.A = table2.A
) sel
"""
curs.executescript(sql)
conn.commit()
pandas.read_sql('select * from table1', conn)
A B C
0 1.0 a None
1 1.0 b None
2 2.0 c None
3 NaN None x
4 NaN None x
5 NaN None y
Run Code Online (Sandbox Code Playgroud)
上面列表中的解决方案 3
sql = """
update table1
set C = (
select table2.D
from table2
inner join table1 on table1.A = table2.A
)
"""
curs.executescript(sql)
conn.commit()
pandas.read_sql('select * from table1', conn)
A B C
0 1 a x
1 1 b x
2 2 c x
Run Code Online (Sandbox Code Playgroud)
这显然是错误的,因为最后一行更新为x,它应该是y
此时我几乎没有选择。任何帮助深表感谢
我认为正确的方法是使用sqlite 版本 3.33UPDATE-FROM引入的语法(在提出这个问题时不可用):
UPDATE table1 AS dst
SET C=src.D
FROM table2 AS src
WHERE dst.A=src.A
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2962 次 |
| 最近记录: |