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

MSSQL如何查询所有关联lot成本均高于指定值的订单?

实现方法:筛选所有关联批次成本均高于100的订单

当然可以用单条SQL实现这个需求,而且有几种高效直观的写法,我给你详细说明:

方法1:使用NOT EXISTS(推荐,性能优)

这是最直观也通常效率最高的写法,核心逻辑是找出不存在任何成本≤100的关联批次的订单:

SELECT o.*
FROM orders o
WHERE NOT EXISTS (
    SELECT 1
    FROM batches b
    WHERE b.order_id = o.order_id  -- 替换为你的实际关联字段
      AND b.cost <= 100
);

说明:

  • 子查询会检查当前订单是否存在符合条件的批次,只要有一个批次成本≤100,该订单就会被排除。
  • 如果订单没有关联任何批次,这个写法会自动保留它(因为子查询找不到匹配项,NOT EXISTS返回TRUE),如果你想排除无批次的订单,可以在WHERE里再加EXISTS (SELECT 1 FROM batches b WHERE b.order_id = o.order_id)。

方法2:使用GROUP BY + HAVING

通过聚合函数判断订单下所有批次的最小成本是否高于100(最小成本都>100,那所有批次成本肯定都>100):

SELECT o.order_id, o.order_date, -- 列出你需要的所有订单字段
       MIN(b.cost) AS lowest_batch_cost
FROM orders o
JOIN batches b ON o.order_id = b.order_id
GROUP BY o.order_id, o.order_date -- 必须包含所有非聚合的选中字段
HAVING MIN(b.cost) > 100;

说明:

  • 这个写法会自动排除没有关联批次的订单(因为JOIN会过滤掉无匹配的订单)。如果要保留无批次的订单,改成LEFT JOIN,并调整HAVING条件:HAVING MIN(ISNULL(b.cost, 101)) > 100(这里假设无批次的订单视为符合条件,你可以根据需求修改默认值)。

方法3:使用EXCEPT

逻辑是所有订单减去存在不合格批次的订单,写法更偏向集合思维:

SELECT o.*
FROM orders o
EXCEPT
SELECT o.*
FROM orders o
JOIN batches b ON o.order_id = b.order_id
WHERE b.cost <= 100;

说明:

  • EXCEPT会返回第一个查询中存在,但第二个查询中不存在的记录,也就是自动排除了有不合格批次的订单。这个写法逻辑清晰,但数据量较大时性能可能不如前两种。

内容的提问来源于stack exchange,提问作者wojtek6000

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:18:24