我有两张桌子。 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))
这并未列出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倍)
谢谢。
答案 0 :(得分:3)
当您使用 <hundreds>
<hundred>
<style>test</style>
<label>label</label>
<descriptiontext>something description</descriptiontext>
<viewalllink>viewurl</viewalllink>
<viewalllabel>viewurl</viewalllabel>
<contendors>
<contendor>
<locid>810</locid>
</contendor>
<contendors>
</hundred>
</hundreds>
时,如果表LEFT JOIN
中没有匹配的行,则这些列将为B
,因此NULL
将始终为false。
将限制放在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
子句应该只包含要连接的表之间的比较。
答案 1 :(得分:0)
由于您正在执行left join
,因此B中的某些日期将为NULL。如果您希望所有结果都在日期范围AND结果中而B中没有关联记录,则需要考虑到这一点:
WHERE B.date IS NULL OR B.date BETWEEN %s AND %s