我有一个SQL查询,如:
select gift.id as giftId, gift.title, count(vouchercode.id) as stock
from gift
inner join vouchertemplate
left join vouchercode
on gift.voucherTemplate = vouchertemplate.id
and vouchertemplate.id = vouchercode.template
and vouchercode.given = 0
and gift.id in (5, 6, 7)
group by gift.id
我希望所有行都gift.id
为5,6,7
之一,但我也会获得4
行。这是为什么?
答案 0 :(得分:2)
你已离开加入。你需要:
select gift.id as giftId, gift.title, count(vouchercode.id) as stock
from gift
inner join vouchertemplate
left join vouchercode
on gift.voucherTemplate = vouchertemplate.id
and vouchertemplate.id = vouchercode.template
and vouchercode.given = 0
where gift.id in (5, 6, 7)
group by gift.id
当您将其置于JOIN
条件时 - 它仅用于连接。出于这个原因,你得到 4 。你必须把它放在WHERE
条款中。
如果此查询与您的业务逻辑不对应,请详细说明重新设计查询所需的结果类型。
答案 1 :(得分:0)
当您编写join
时,您应该在每个on
子句之间的每个表之间放置条件,在join
个句子中,在on
个句子中。结束。实际上,大多数数据库(和ANSI)都需要这种语法。
这实际上并不能解决您的问题。这是由on
子句而不是where
子句中的条件引起的:
select g.id as giftId, g.title, count(vc.id) as stock
from gift g inner join
vouchertemplate vt
on g.voucherTemplate = vt.id left join
vouchercode vc
on vt.id = vc.template and vc.given = 0
where g.id in (5, 6, 7)
group by g.id ;
left join
保留第一个表中的所有记录,无论on
条件评估是否为真。因此,对第一个表进行过滤对left join
没有影响。同样,对第二个表的过滤对right join
无效。
解决方案是将条件放在where
子句中的第一个表中。
还要注意表别名的使用,以便查询更容易编写和阅读。