首页 > 解决方案 > 使用python比较Sqlite 3中的多个表

问题描述

我对 SQLITE3 和 python 都很陌生。我是一个完整的 SQLite 初学者。我不太明白。我现在正在学习我的项目。我正在做一个项目,我有一个数据库,里面有大约 20 个表。一个表用于用户输入,其他表预加载了值。如何比较和匹配预加载表中的哪些值与用户表?例如:

Users Table: 
Barcode:      Item: 
1234          milk
4321          cheese
5678          butter
8765          water
9876          sugar

Pre-Loaded Table: 
Barcode:       Availability:
1234               1
5678               1
9876               1
1111               1

现在,我希望能够将预加载表中的每一行与用户表中的每一行进行比较。它们都有共同的 Barcode 列,以便能够进行比较。因此,在查询过程中,它应该检查每一行:

1234 - milk - 1 (those columns are equal ) 
5678 - butter - 1 ( those columns are equal) 
9876 - sugar - 1 (those columns are equal) 
1100 - - 1 ( this barcode does not exist in the Users Table)

因此,当条形码(在本例中为 1100)在用户表中不存在时,代码应打印:您没有预加载表的所有项目。我怎样才能得到这个代码?

到目前为止我有这个:顺便说一句,这段代码确实有效。

import sqlite3 as sq



connect = sq.connect('Food_Data.db')
con = connect.cursor()

sql = ("SELECT Users_Food.Barcode, Users_Food.Item, Recipe1.Ham_Swiss_Omelet FROM Users_Food INNER JOIN Recipe1 ON Users_Food.Barcode = Recipe1.Barcode WHERE Recipe1.Ham_Swiss_Omelet = '1'")
con.execute(sql)
data = con.fetchall()
print("You can make: Ham Swiss Omelet")
formatted_row = '{:<10} {:<9} {:>9} '
print(formatted_row.format("Barcode", "Ingredients", "Availability"))
for row in data:
    print(formatted_row.format(*row))
    #print (row[:])
    #connect.commit()

它打印:

You can make: Ham Swiss Omelet
Barcode    Ingredients Availability 
9130849874 butter            1 
2870896881 eggs              1 
5501066727 water             1 
1765023029 salt              1 
9118188735 pepper            1 
4087256674 ham               1 
3009527296 cheese            1 

SQLite 代码:

sql = ("SELECT Users_Food.Barcode, Users_Food.Item, Recipe1.Ham_Swiss_Omelet FROM Users_Food INNER JOIN Recipe1 ON Users_Food.Barcode = Recipe1.Barcode WHERE Recipe1.Ham_Swiss_Omelet = '1'")

它将两张表格与共同的条形码以及相应的食品名称和供应情况相结合。但是,如果预加载表中不存在其中一个条形码值,那么当我比较时,我如何进行编码以知道它不存在,同时仍然显示这两个表之间的共同点?这就像检查表是否相同。

标签: pythondatabasesqlite

解决方案


也许用 LEFT JOIN 和 CASE 语句试试运气。

来自sqlite 文档

如果连接运算符是“LEFT JOIN”或“LEFT OUTER JOIN”,则在应用 ON 或 USING 过滤子句后,将在原始左侧输入数据集中的每一行的输出中添加一个额外的行对应于复合数据集中的任何行(如果有)。

您需要将 Recipe1 表作为左侧表,因为您需要选择该表中的每一行。Users_Food 中的所有列在额外行中都将为空。示例查询添加了另一列“状态”,您可以在 python 中使用该列。稍微重新安排一下:

SELECT Users_Food.Barcode, Users_Food.Item, Recipe1.Ham_Swiss_Omelet,
CASE WHEN (Users_Food.Barcode is null then 'You cannot make this recipe' else ' ' END as status
FROM Recipe1
LEFT JOIN Users_Food ON Users_Food.Barcode = Recipe1.Barcode
WHERE Recipe1.Ham_Swiss_Omelet = '1'

在 python 中,您可能不想这样做,print("You can make: Ham Swiss Omelet")因为在获取所有返回的行之前,您不会知道这是否正确。

在让 SQL 返回所需的行之后,您可以使用 python 来获得所需的输出。


推荐阅读