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

如何编写SQL查询筛选近2个月无报价的供应商联系邮箱?

解决近2个月无报价供应商邮箱的SQL查询问题

我来帮你搞定这个SQL查询的问题!先理清楚你的需求:要找出近2个月没有任何报价记录的供应商联系邮箱。咱们先拆解原查询的问题,再给出正确的写法。

你的表结构

offers表

id | supplier_id | updated_at (日期字段)
1  | 3           | 18-05-2018
2  | 1           | 01-01-2018

suppliers表

id | name    | contact_email
1  | sujith  | sujith@sujith.com
2  | naveen  | naveen@naveen.com
3  | sanju   | sanj@sanj.com

需求说明

筛选出近2个月内没有任何报价记录的供应商的contact_email,预期输出:

sujith@sujith.com
naveen@naveen.com

原查询的问题

你写的查询有几个关键问题:

  1. 连接方式错误:INNER JOIN只会返回同时存在于offers和suppliers的记录,但你要找的是没有报价记录或报价记录超过2个月的供应商,内连接会直接排除从未报过价的供应商(比如naveen)。
  2. 条件逻辑错误:你的WHERE条件是找报价时间早于2个月前的记录,这会返回有旧报价的供应商,而不是近2个月完全没有报价的供应商;另外字段列表里漏了逗号,语法本身也有问题。
  3. 查询字段冗余:你不需要返回offers的字段,目标只是供应商的邮箱。

正确的SQL查询

这里提供两种常用的写法,都能精准满足需求:

写法一:LEFT JOIN + 空值判断

SELECT s.contact_email
FROM suppliers s
LEFT JOIN offers o 
    ON s.id = o.supplier_id
    AND o.updated_at >= DATE_SUB(CURDATE(), INTERVAL 2 MONTH)
WHERE o.id IS NULL;

解释:

  • 用LEFT JOIN保留所有供应商,仅关联近2个月内有报价的记录
  • WHERE o.id IS NULL会筛选出近2个月没有匹配到报价的供应商(包括从未报过价的)

写法二:NOT EXISTS子查询

SELECT s.contact_email
FROM suppliers s
WHERE NOT EXISTS (
    SELECT 1
    FROM offers o
    WHERE o.supplier_id = s.id
      AND o.updated_at >= DATE_SUB(CURDATE(), INTERVAL 2 MONTH)
);

解释:

  • 子查询检查当前供应商是否存在近2个月内的报价记录
  • NOT EXISTS返回所有没有符合条件报价的供应商

这两种写法都会返回你预期的结果:sujith@sujith.com和naveen@naveen.com(sanju的最近报价在2个月范围内,所以被排除)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:28:11