【问题标题】:Merging two SQLite tables from the same database with python and sqlite3使用 python 和 sqlite3 合并来自同一数据库的两个 SQLite 表
【发布时间】:2018-10-11 22:16:42
【问题描述】:

我正在尝试创建一个新表,它将两个不同表中的列组合在一起,并使用两者都通用的 id 列作为关键字。假设我有一个名为 db.db 的数据库,其中包含两个名为 table1 和 table2 的表。

table1 如下所示:

id | item | price
-------------
 1 | book | 20  
 2 | copy | 30   
 3 | pen  | 10 

和table2这样:

id | shop | color
-------------
 1 |  11  | blue  
 2 |  34  | red   
 3 |  25  | red 

我应该在 sqlite3 中写什么才能有这样的东西??

id | item | price | shop | color
-------------------------------
 1 | book | 20    |  11  | blue 
 2 | copy | 30    |  34  | red   
 3 | pen  | 10    |  25  | red 

谢谢!

【问题讨论】:

标签: python sql sqlite


【解决方案1】:

已编辑:尝试将 LEFT JOIN 更改为 INNER JOIN 以查看它是否有效。

import sqlite3
conn = sqlite3.connect('db.db')   
c = conn.cursor()

def merged():
    c.execute('CREATE TABLE table3 AS SELECT * FROM table1 t1 INNER JOIN table2 t2 ON t1.id = t2.id')
    for line in c.fetchall():
        print(line)
merged()

【讨论】:

  • 我已经尝试过您的方法,但是当我查询时,表 2 仍然具有相同的列名。我想要一个有 4 列的 table3
  • 我已编辑。尝试将左连接更改为内连接
  • 我再次尝试使用 INNER JOINT 但仍然,table2 中的列数比开始时要多。但是我尝试了以下并且有效,也许我没有很好地解释我想要什么:'CREATE TABLE table3 AS SELECT * FROM table1 t1 INNER JOIN table2 t2 ON t1.id = t2.id'
  • 太好了,我很高兴你做对了。我会把它放在最后的答案中,谢谢
【解决方案2】:

你可以使用itertools.groupby:

import itertools, sqlite3
d1 = list(sqlite3.connect('db.db').cursor().execute("SELECT id, item, price FROM table1"))
d2 = list(sqlite3.connect('db.db').cursor().execute("SELECT id, item, price FROM table2"))
full_data = sorted(d1+d2, key=lambda x:x[0])
grouped = [[a, list(b)] for a, b in itertools.groupby(full_data, key=lambda x:x[0])]
final_grouped = [[a, *[i for c in b for i in c[1:]]] for a, b in grouped]
conn = sqlite3.connect('db.db')
conn.execute('CREATE TABLE file3 (id real, item text, price real, shop real, color text)')
conn.executemany('INSERT INTO file3 VALUES (?, ?, ?, ?, ?)', final_grouped)
conn.commit()
conn.close()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    • 1970-01-01
    相关资源
    最近更新 更多