来自三个表的左联接

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

以上是关于来自三个表的左联接的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Access 中使用来自另一个表的联接从一个表中删除项目?

转载-- SQL连接查询2 外连接(左右联接查询)

日期之间的左联接匹配

与列数少于原始表的临时表的联接是不是比与原始表的联接更快?

hive内联接和外联接

在其中一个联接上选择具有最大值的记录