Mysql NOT IN嵌套子查询返回空集,因此没有联接结果
我正在编写一个spring批处理程序,用于查找即将过期的项。工作正常,但我在一次测试中发现了一些问题。这是一个新的批处理程序,它依赖于另一个新表来跟踪已报告的过期项目。例如:Mysql NOT IN嵌套子查询返回空集,因此没有联接结果,mysql,select,Mysql,Select,我正在编写一个spring批处理程序,用于查找即将过期的项。工作正常,但我在一次测试中发现了一些问题。这是一个新的批处理程序,它依赖于另一个新表来跟踪已报告的过期项目。例如: 获取供应商通知表中没有条目的即将过期的项目 发送电子邮件 其他业务逻辑 在供应商通知表中创建条目 这是我的sql语句 select * from item join vendor_notification where item.item_id NOT IN(SELECT vendor_notification.ite
- 获取供应商通知表中没有条目的即将过期的项目
- 发送电子邮件
- 其他业务逻辑
- 在供应商通知表中创建条目
select * from item join vendor_notification
where item.item_id NOT IN(SELECT vendor_notification.item_id
FROM vendor_notification);
只要供应商通知表中有数据,该方法就可以正常工作。但是,一旦我重置并清除测试数据,就不会返回任何结果。如果我向vendor_通知表中添加了一行,并向item中添加了一行,那么我将获得该新行
是否有更好的方法执行上述查询,以便为嵌套查询处理空返回集?如果内部查询返回null,NOT IN子句将计算为false
select * from item
where (SELECT count(vendor_notification.item_id)
FROM vendor_notification WHERE vendor_notification.item_id = item.item_id) = 0;
内部查询现在返回匹配记录的计数,如果没有,则计数为零。
不在
空集应返回所有记录。应删除没有加入条件的加入供应商通知。令人惊讶的是,这是有效的语法。@Martin Smith我不是mySql方面的专家,但我直接针对DB执行上述语句。如果该表是空的,我认为它将为嵌套的select返回一个空集,但它似乎返回null(因为notin也不返回任何内容),这非常有效,谢谢。我知道有更好的方法,只是没看到。请更正第一句。空集合和包含NULL
的集合之间存在差异。如果结果为零,NOT IN子句将计算为true。我认为OP的实际问题是没有连接条件的JOIN
会进行交叉连接,并且交叉连接到空表会将行减少到0
顺便说一句