You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何查询未录入且所有关联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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 02:52:41