Почему количество элементов при выборке из базы данных, не соответствует запросу
Выполняю запрос к SQL Server:
cur.execute(f"""
SELECT
*** нужные мне столбцы ***
FROM (
SELECT *
FROM table_1
OFFSET 0 ROWS FETCH NEXT 100 ROWS ONLY
) AS tab_1
JOIN
table_2 tab_2 ON tab_1.id = tab_2.tab_1_id
JOIN
table_3 tab_3 ON tab_2.id = tab_3.tab_2_id
""")
table_data = cur.fetchall()
Предполагаю, что он сначала извлечет строки с 0 по 100 из table_1 - затем произведет выборку из остальных таблиц, согласно условию. После выполнения запроса, я проверяю, сколько получил данных, путем сохранения в отдельный массив уникальных значений из полученный от БД данных:
check_route = []
for t in table_data:
if not t[0] in check_route:
check_route.append(t[0])
Результат: len(check_route) => 95 ... вопрос - почему 95, если в условии к выборке из БД - написано 100? В чем может быть причина?
Ответы (1 шт):
В SQL Server (да наверное и не только в нём, а вообще в современном SQL) под JOIN имеется в виду INNER JOIN. То есть если в вашем случае в таблицах 2 и/или 3 не будет записей, соответствующих критерию соединения таблиц, то на выходе после JOIN-ов будет меньше записей, чем было выбрано из таблицы 1.
Если вам нужно, чтобы показывались все отобранные записи из таблицы 1, а соединяемые записи из таблиц 2 и 3 для вас не важны, то просто заменяете JOIN на LEFT JOIN и тогда в тех строках, где соответствующих записей нет, вместо полей таблиц 2 и/или 3 будут значения NULL (а в самом питоне видимо уже None).