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
相关产品推荐
相关产品推荐

