我对 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()
我假设它将首先从 table_1 中提取第 0 到第 100 行 - 然后根据条件从其余表中选择。执行查询后,我通过将从数据库收到的数据中的唯一值保存到单独的数组中来检查收到了多少数据:
check_route = []
for t in table_data:
if not t[0] in check_route:
check_route.append(t[0])
结果:len(check_route)=> 95...问题是——如果从数据库中选择的条件是 100,为什么是 95?可能是什么原因呢?
在 SQL Server 中(可能不仅在其中,而且在现代 SQL 中)它的
JOIN
意思是INNER JOIN
。也就是说,如果在您的情况下,表 2 和/或 3 中没有符合表连接标准的记录,那么JOIN
-s 之后的输出将包含比从表 1 中选择的记录更少的记录。如果您需要显示表 1 中选定的所有记录,而表 2 和表 3 中的连接记录对您来说并不重要,那么只需
JOIN
用替换LEFT JOIN
,然后在那些没有相应记录的行中,将替换表 2 和/或表 3 的字段NULL
(显然在 Python 本身中已经有了None
)。