MYSQL 左连接函数结果缺少行
MYSQL left join function results missing rows
我有两张桌子。
A with item,(库存主清单)
B 包含商品、日期和销售额(销售额 sheet)
我有:
cursor.execute(
"SELECT A.item, sum(B.qty) \
FROM A \
LEFT JOIN sales on A.item = B.item \
WHERE B.date BETWEEN %s AND %s\
GROUP BY A.item", (gr2014start, gr2014end))
这没有列出 A 中的所有项目
我了解到在选定的日期范围内,A 中的某些商品在 B 上没有任何销售,因此不存在。
有没有一种方法可以使用连接函数将它们列为零?
我有这个:
cursor.execute("SELECT A.item, \
(SELECT COALESCE(sum(qty),0) From B \
WHERE (A.item = B.item) \
AND (B.date BETWEEN %s AND %s)) as 'Qty' \
FROM A", (gr2014start, gr2014end))
这行得通。但是不知何故这个非常慢(比上面不完整的连接函数慢 3 或 4 倍)
谢谢。
由于您正在执行 left join
B 中的某些日期将为 NULL。如果您想要日期范围内的所有结果和 B 中没有关联记录的结果,您需要考虑到这一点:
WHERE B.date IS NULL OR B.date BETWEEN %s AND %s
当您使用 LEFT JOIN
时,如果 table B
中没有匹配的行,这些列将为 NULL
,因此 B.date BETWEEN %s AND %s
将始终是假的。
将 B.date
的限制放在 ON
子句中,而不是 WHERE
子句中:LEFT JOIN sales AS B ON A.item = B.item AND B.date BETWEEN %s AND %s
。这是 ON
子句应仅包含要连接的 table 之间的比较的一般规则的例外情况。
我有两张桌子。 A with item,(库存主清单) B 包含商品、日期和销售额(销售额 sheet)
我有:
cursor.execute(
"SELECT A.item, sum(B.qty) \
FROM A \
LEFT JOIN sales on A.item = B.item \
WHERE B.date BETWEEN %s AND %s\
GROUP BY A.item", (gr2014start, gr2014end))
这没有列出 A 中的所有项目 我了解到在选定的日期范围内,A 中的某些商品在 B 上没有任何销售,因此不存在。 有没有一种方法可以使用连接函数将它们列为零?
我有这个:
cursor.execute("SELECT A.item, \
(SELECT COALESCE(sum(qty),0) From B \
WHERE (A.item = B.item) \
AND (B.date BETWEEN %s AND %s)) as 'Qty' \
FROM A", (gr2014start, gr2014end))
这行得通。但是不知何故这个非常慢(比上面不完整的连接函数慢 3 或 4 倍)
谢谢。
由于您正在执行 left join
B 中的某些日期将为 NULL。如果您想要日期范围内的所有结果和 B 中没有关联记录的结果,您需要考虑到这一点:
WHERE B.date IS NULL OR B.date BETWEEN %s AND %s
当您使用 LEFT JOIN
时,如果 table B
中没有匹配的行,这些列将为 NULL
,因此 B.date BETWEEN %s AND %s
将始终是假的。
将 B.date
的限制放在 ON
子句中,而不是 WHERE
子句中:LEFT JOIN sales AS B ON A.item = B.item AND B.date BETWEEN %s AND %s
。这是 ON
子句应仅包含要连接的 table 之间的比较的一般规则的例外情况。