我有两张桌子。A 带有物料,(库存主清单) B 带有物料、日期和销售额(销售表)
我有:
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))
Run Code Online (Sandbox Code Playgroud)
这并没有列出 A 中的所有项目我知道在选定的日期范围内,A 中的某些项目在 B 上没有任何销售,因此它不存在。有没有办法可以使用 join 函数将它们列为零?
我有这个:
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))
Run Code Online (Sandbox Code Playgroud)
这有效。但不知何故,这个非常慢(比顶部的不完整连接函数慢 3 或 4 倍)
谢谢你。
当您使用 a 时LEFT JOIN,如果 table 中没有匹配的行B,则这些列将为NULL,因此B.date BETWEEN %s AND %s将始终为 false。
沽上限制B.date了中ON条款,而不是WHERE条款:LEFT JOIN sales AS B ON A.item = B.item AND B.date BETWEEN %s AND %s。这是一般规则的例外,即ON子句应该只包含被连接的表之间的比较。