来自三个表的左联接

问题描述 投票:0回答:2

我正在学习基础数据库课程,但是我们遇到了一个问题,我正在努力寻找一个好的解决方案。

我们将在简化的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;

这将返回一个空结果集。谁能为我指出正确的解决方法?

sql sqlite
2个回答
0
投票

我为此推荐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'
)

0
投票

不需要聚合。您想要的就是与左联接不匹配的产品:

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
© www.soinside.com 2019 - 2024. All rights reserved.