如何查询未录入且所有关联Item均已分配部门的Invoice
解决方法
你要的是只保留「未录入且所有关联Item都已分配部门」的发票,原查询的问题是只要发票里有一个符合条件的Item就会返回,哪怕还有其他未归类的Item。这里给你几种可行的修改方式:
方式一:用NOT EXISTS排除有未归类Item的发票
直接检查当前发票有没有关联的Item是department_name为NULL的,没有的话就保留:
SELECT i.* FROM Invoice i WHERE i.invoice_entered IS NULL AND NOT EXISTS ( SELECT 1 FROM Invoice_has_Item ih JOIN Item it ON ih.item_num = it.item_num WHERE ih.invoice_number = i.invoice_number AND it.department_name IS NULL );
方式二:分组统计验证全部分类完成
通过分组统计每个发票的总Item数,和已归类(department_name非NULL)的Item数,两者相等就说明所有Item都已归类:
SELECT i.* FROM Invoice i JOIN Invoice_has_Item ih ON i.invoice_number = ih.invoice_number JOIN Item it ON ih.item_num = it.item_num WHERE i.invoice_entered IS NULL GROUP BY i.invoice_number, i.invoice_entered -- 需将Invoice表的所有字段都加入GROUP BY,或根据数据库设置调整写法 HAVING COUNT(*) = COUNT(it.department_name);
注:
COUNT(it.department_name)会自动忽略NULL值,所以当总数等于非NULL数量时,就代表没有未归类的Item。
方式三:用LEFT JOIN筛选无未归类Item的发票
先找出所有存在未归类Item的发票编号,再从结果里排除这些发票:
SELECT i.* FROM Invoice i LEFT JOIN ( SELECT DISTINCT ih.invoice_number FROM Invoice_has_Item ih JOIN Item it ON ih.item_num = it.item_num WHERE it.department_name IS NULL ) unclassified_invoices ON i.invoice_number = unclassified_invoices.invoice_number WHERE i.invoice_entered IS NULL AND unclassified_invoices.invoice_number IS NULL;
原查询问题说明
你原来的查询用INNER JOIN加Item.account_num IS NOT NULL(注意你问题里要求的是department_name,原语句写的是account_num,可能是笔误),会返回未录入发票中至少有一个已归类Item的记录,但如果发票里还有未归类的Item,原查询依然会返回该发票的部分条目,导致结果里出现重复的发票或者不完整的信息。上面的三种方法都能确保返回的发票满足「所有关联Item都已分配部门」的要求。
内容的提问来源于stack exchange,提问作者StudioOne
相关产品推荐
相关产品推荐

