Сравнение нескольких таблиц в Sqlite 3 с использованием Python - PullRequest
0 голосов
/ 18 марта 2019

Я новичок в 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'")

Он объединяет две таблицы с общим штрих-кодом и соответствующими названиями продуктов и их доступностью. Однако, если одно из значений штрих-кода отсутствует в таблице Pre-Loaded, когда я сравниваю, как я могу приступить к кодированию, чтобы узнать, что его там нет, и при этом отображать, что общего между этими двумя таблицами? Это все равно что проверять идентичность таблиц.

1 Ответ

0 голосов
/ 21 марта 2019

Возможно, вам повезет с LEFT JOIN и оператором CASE.

From sqlite doc

Если оператор соединения является "LEFT JOIN"или "LEFT OUTER JOIN", затем после применения условий фильтрации ON или USING к выходу добавляется дополнительная строка для каждой строки в исходном левом входном наборе данных, которая вообще не соответствует строкам в наборе составных данных (если есть).

Вам нужно, чтобы таблица Recipe1 была левой таблицей, потому что вам нужно выбрать каждую строку в этой таблице.Все столбцы из Users_Food будут нулевыми в дополнительной строке.Пример запроса добавляет еще один столбец «статус», который вы можете использовать в питоне.С небольшой перестановкой:

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 для возврата нужных вам строк, вы можете поиграться с питоном, чтобы получить желаемый результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...