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

MySQL技术问询:如何查询res_srvs表中无inv_supp2srv关联的行

正确查询无关联记录的SQL写法

你原来的SQL语句逻辑上存在冲突——你同时使用了隐式内连接(用逗号分隔两张表)和NOT EXISTS,内连接会只保留两张表中匹配的记录,而NOT EXISTS又要筛选出没有匹配的记录,这就导致结果永远是空的,我来给你两种靠谱的解决方案:

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

这种方式直接从res_srvs表中筛选符合条件的记录,同时检查inv_supp2srv中是否没有对应的关联记录:

SELECT 
    srv.net, 
    srv.tax, 
    srv.net + srv.tax AS amount, 
    srv.id AS srv_id 
FROM res_srvs AS srv 
WHERE 
    srv.clientID = 1 
    AND srv.from_date >= '2020-03-01' 
    AND NOT EXISTS (
        SELECT 1 -- 这里用1代替*更高效,数据库不需要返回所有字段
        FROM inv_supp2srv AS i2s 
        WHERE i2s.srvID = srv.id 
        -- 如果业务要求必须是同一个客户下的关联,就加上下面这行,否则可以去掉
        AND i2s.clientID = srv.clientID 
    );

方法二:使用 LEFT JOIN + IS NULL

这是另一种常用的查询无匹配记录的方式,通过左连接保留res_srvs的所有记录,再筛选出关联不上的那些:

SELECT 
    srv.net, 
    srv.tax, 
    srv.net + srv.tax AS amount, 
    srv.id AS srv_id 
FROM res_srvs AS srv 
LEFT JOIN inv_supp2srv AS i2s 
    ON srv.id = i2s.srvID 
    -- 同样,根据业务需求决定是否加上客户ID的关联条件
    AND i2s.clientID = srv.clientID 
WHERE 
    srv.clientID = 1 
    AND srv.from_date >= '2020-03-01' 
    AND i2s.srvID IS NULL; -- 筛选出没有关联上的记录

小提示

  • 如果inv_supp2srv表的srvID字段有索引,NOT EXISTS的性能通常会更好一些
  • 两种方法的核心都是避免内连接,因为内连接会直接过滤掉无关联的记录,和你的需求相悖

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 23:42:38