SQL:左联接三个表

问题描述 投票:1回答:1

我有三个桌子

Products (idProduct, name)
Invoices(typeinvoice, numberinvoice, date)
Item-invoices(typeinvoice, numberinvoice, idProduct)

我的查询必须选择2019年未售出的所有产品。我可以使用一个函数从日期中获取年份,例如year(i.date)。我知道商品发票表中未出现的产品是未售出的产品。因此,我尝试使用这两个代码并获得了良好的输出。

   SELECT p.name
   FROM Products p
   EXECPT
   SELECT ii.idProduct
   FROM Item-invoices ii, Invoices i
   WHERE ii.typeinvoice=i.typeinvoice
   AND ii.numberinvoice=i.numberinvocice
   AND year(i.date)=2019

并且其他代码使用子查询:

SELECT p.name
FROM Products p
WHERE p.idProduct NOT IN 
            (SELECT ii.idProduct
            FROM Item-invoices ii, Invoices i
            WHERE ii.typeinvoice=i.typeinvoice
            AND ii.numberinvoice=i.numberinvocice
            AND year(i.date)=2019) 

答案是我如何使用left join命令具有相同的输出。我已经尝试过

SELECT p.name
FROM Products p 
LEFT JOIN Item-invoices ii ON
            p.IdProduct=ii.idProduct
LEFT JOIN Invoices i ON
            ii.typeinvoice=i.typeinvoice
            AND ii.numberinvoice=i.numberinvocice
WHERE year(i.date)=2019
AND ii.idProduct IS NULL

我知道这是错误的,但找不到解决方法

有帮助吗?

sql sqlite left-join
1个回答
0
投票

您快到了。您只需要将发票日期上的条件从from子句移至onjoin子句:

SELECT p.name
FROM Products p 
LEFT JOIN Item-invoices ii ON
            p.IdProduct=ii.idProduct
LEFT JOIN Invoices i ON
            ii.typeinvoice=i.typeinvoice
            AND ii.numberinvoice=i.numberinvocice
            AND i.date >= '2019-01-01
            AND i.date <  '2020-01-01'
WHERE ii.idProduct IS NULL
© www.soinside.com 2019 - 2024. All rights reserved.