我有三张桌子
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
我知道这是错误的,但找不到解决方案
有什么帮助吗?
你快到了。您只需要将发票日期的条件从的from
条款移动到的on
条款即可join
。
中条件WHERE
条款是强制性的,所以你没有真正变成了LEFT JOI
一个INNER JOIN
例外,它们不能被满足(因为在这两个条件WHERE
子句不能在同一时间如此)。
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
请注意,我将日期过滤器更改为半开过滤器,该过滤器可直接对存储的日期进行操作,而无需使用日期函数;这是一种更有效的处理方式(因为它允许数据库使用现有索引)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句