由于0回复,我猜我的LEFT JOIN问题涉及到太深奥的数据库的太多细节。我已经围绕这个问题进行了编程,但我仍然想知道如何加入类似的场景:
假设一个基本的代理键策略(每个表都有一个只能自动递增的id字段),以及一个显而易见的父类的外键。全部大写的单词可以被视为表格。
假设您有一个包含DOGS的数据库。示例:Wolfie,Winston,Butch和Benny
每个DOG都有FLEA。 (为简单起见,我们可以让一只跳蚤只生活在一只狗身上,并留下一对多的关系)。跳蚤有id作为名字或其他什么,以及它们的颜色。
每个FLEA将多次BITE它的DOG主机,并存储在此数据库中,并每天记录。
字段ID(PK),跳蚤ID(FK),日期,times_bitten。
假设你想得到每条狗被咬的总次数(这很容易)
SELECT Dog.Name, sum(Bite.times_bitten)
FROM Dog, Flea, Bite
WHERE Dog.id = Flea.Dog_id and Bite.id = Flea.Bite_id
GROUP BY Dog.Name
让我们说你要在“WHERE”条款中添加标准,将其限制为“Brown”跳蚤,而没有“Brown”Fleas永远不会让Benny陷入困境。
SELECT Dog.Name, sum(Bite.times_bitten)
FROM Dog, Flea, Bite
WHERE Dog.id = Flea.Dog_id and Bite.id = Flea.Bite_id and Flea.color = "Brown"
GROUP BY Dog.Name
Benny不在结果中
你将如何重写查询,以便Benny的名字仍然显示,在总和中提供0(最好)或NULL,而不是仅仅从结果中完全取消Benny?
这似乎是关于多个左外连接..但是有这样的多个表,那些容易找到的文档似乎没有回答涉及3个表的问题,在3个表的中间有一个值过滤器。< / p>
有没有人建议如何重写这个以允许多个左外连接,或者有一些其他方法在查询中保留所有狗的名字,即使sum = 0? < / p>
答案 0 :(得分:18)
这应该有效:
SELECT Dog.Name, COALESCE(SUM(Bite.times_bitten), 0) AS times_bitten
FROM Dog
LEFT JOIN Flea
ON Flea.Dog_id = Dog.id
AND Flea.color = "Brown"
LEFT JOIN Bite
ON Bite.id = Flea.Bite_id
GROUP BY Dog.Name
通过使用LEFT JOIN
s,您将获取所有Dog记录,甚至是那些没有相应Fleas的记录(连接中的列将为NULL)。如果没有找到记录,您可以使用COALESCE
将times_bitten
设置为0(否则它将为NULL)。
您可能还希望按Dog.id
而不是Dog.Name
进行分组(除非不可能有多条同名的狗?)