Почему количество элементов при выборке из базы данных, не соответствует запросу

Выполняю запрос к 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 шт):

Автор решения: CrazyElf

В SQL Server (да наверное и не только в нём, а вообще в современном SQL) под JOIN имеется в виду INNER JOIN. То есть если в вашем случае в таблицах 2 и/или 3 не будет записей, соответствующих критерию соединения таблиц, то на выходе после JOIN-ов будет меньше записей, чем было выбрано из таблицы 1.

Если вам нужно, чтобы показывались все отобранные записи из таблицы 1, а соединяемые записи из таблиц 2 и 3 для вас не важны, то просто заменяете JOIN на LEFT JOIN и тогда в тех строках, где соответствующих записей нет, вместо полей таблиц 2 и/или 3 будут значения NULL (а в самом питоне видимо уже None).

→ Ссылка