使用python比较Sqlite 3中的多个表

时间:2019-03-18 19:10:46

标签: python database sqlite

我对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

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

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'")

它将两个表与共同的条形码以及相应的食品名称和可用性结合在一起。但是,如果在预加载表中没有条形码值之一,那么当我比较时如何编码以了解它不存在,同时仍显示这两个表之间的共同点?就像检查表是否相同。

1 个答案:

答案 0 :(得分:0)

也许通过LEFT JOIN和CASE语句来试试运气。

来自sqlite doc

  

如果加入操作员是“ 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来获得所需的输出。