来自三个表的左联接
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了来自三个表的左联接相关的知识,希望对你有一定的参考价值。
我正在学习基础数据库课程,但是我们遇到了一个问题,我正在努力寻找一个好的解决方案。
我们将在简化的SQLite NorthWind数据库中查询2014年4月未销售的产品。
我需要查询三个表来获取它,Product,OrderItem和Order表。 OrderItem是具有ProductId和OrderId的表。订单表包含OrderDate。
[在此之前的演讲是关于各种联接的,我怀疑这个微粒问题涉及左联接,因为我想按日期对Order进行过滤后在OrderItem表中列出没有条目的产品。
到目前为止是我的查询:
SELECT COUNT(OI.Id) AS Amount, P.ProductName, O.OrderDate
FROM Product P
LEFT JOIN OrderItem OI ON P.Id = OI.ProductId
LEFT JOIN [Order] O ON O.Id = OI.OrderId
WHERE O.OrderDate LIKE("Apr%2014%")
GROUP BY P.ProductName
HAVING Amount = 0
ORDER BY Amount;
这将返回一个空结果集。谁能为我指出正确的解决方法?
答案
我为此推荐not exists
:
select p.*
from products p
where not exists (
select 1
from orderItem oi
left join [order] o on o.id = oi.orderId
where
oi.product = p.id
and o.orderDate >= '2014-04-01'
and o.orderDate < '2014-05-01'
)
另一答案
不需要聚合。您想要的就是与左联接不匹配的产品:
SELECT P.ProductName
FROM Product P
LEFT JOIN OrderItem OI ON P.Id = OI.ProductId
LEFT JOIN [Order] O ON O.Id = OI.OrderId AND O.OrderDate LIKE("Apr%2014%")
WHERE O.Id IS NULL
以上是关于来自三个表的左联接的主要内容,如果未能解决你的问题,请参考以下文章