SQL:左联接与三个表

伊纳基·萨巴拉(IñakiSbarra)

我有三张桌子

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

跨三个表左联接(带联结表)

来自分类Dev

SQL Server:联接三个表

来自分类Dev

SQL联接查询与三个表

来自分类Dev

是否可以对三个表使用AND并使用左联接/内联接

来自分类Dev

左联接两个表到第三个表

来自分类Dev

SQL在三个联接表上查找值

来自分类Dev

在psql中联接三个表(SQL查询)

来自分类Dev

如何在SQL Server中联接三个表

来自分类Dev

MySQL跨三个表联接

来自分类Dev

将三个表与条件联接

来自分类Dev

联接三个表并计数

来自分类Dev

如何对三个表使用联接

来自分类Dev

LINQ查询联接三个表

来自分类Dev

在Solr中联接三个表

来自分类Dev

BigQuery联接三个表

来自分类Dev

获得三个联接表的列

来自分类Dev

SQL Server左联接与3个表

来自分类Dev

SQL内部联接然后左联接3个表

来自分类Dev

具有两个总和和三个表的内部联接的SQL语句

来自分类Dev

使用SQL对三个表进行有效的内部联接

来自分类Dev

SQL Access 2010-三个表上的完全外部联接

来自分类Dev

使用SQL Server,如何查询三个单独的表的外部联接,而这三个表又位于一个共同的列上?

来自分类Dev

包含三个表的联接的查询不起作用?

来自分类Dev

用MAX函数联接三个表

来自分类Dev

共享相同主键的三个表之间的完全联接

来自分类Dev

使用三个表的内部联接编写mysql查询

来自分类Dev

在Laravel中使用冲突的列名联接三个表

来自分类Dev

如何联接三个表并显示结果?

来自分类Dev

如何用NOT IN CLAUSE联接三个表