sqlite:从连接更新列

cav*_*rac 0 sqlite join sql-update pandas

我已经尝试过下面的答案,但我找不到正确的方法

  1. SQLite 内连接 - 使用另一个表中的值进行更新
  2. 在 SQLite 上连接表时如何进行更新?
  3. 从具有相同用户名的另一个表更新表值

问题就在这里。我有一个带有两个表的 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

此时我几乎没有选择。任何帮助深表感谢

Paz*_*azO 5

我认为正确的方法是使用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)