如何从SQL查询结果中排除eng_tc表中指定eo、tc组合的行?
解决方法
你的问题出在原查询的关联逻辑上——你用eng_tc作为中间表做了内连接,所以返回的所有(eo, tc)组合必然是eng_tc里存在的,这就是那些你想排除的行会出现的原因。要实现“排除所有存在于eng_tc的eo、tc组合”的需求,你需要调整查询逻辑,不再依赖eng_tc做内连接,而是用它来过滤掉不需要的行。
下面提供两种标准SQL写法,都能满足你的需求:
方法一:使用NOT EXISTS子查询
这种写法逻辑清晰,在多数数据库中性能表现也不错:
SELECT e.eo, e.ac, c.tc, e.ac_05 FROM eng_effect e JOIN task_c c ON e.ac <> c.ac WHERE NOT EXISTS ( SELECT 1 FROM eng_tc t WHERE t.eo = e.eo AND t.tc = c.tc )
逻辑说明:先关联eng_effect和task_c,只保留ac不相等的行;再通过NOT EXISTS过滤掉那些(e.eo, c.tc)组合在eng_tc里存在的行。
方法二:使用LEFT JOIN + IS NULL
这种写法适合习惯用连接语法的场景:
SELECT e.eo, e.ac, c.tc, e.ac_05 FROM eng_effect e JOIN task_c c ON e.ac <> c.ac LEFT JOIN eng_tc t ON t.eo = e.eo AND t.tc = c.tc WHERE t.eo IS NULL
逻辑说明:先关联eng_effect和task_c得到ac不等的行,再左连接eng_tc;最后只保留在eng_tc里找不到匹配的行(即t.eo为NULL的记录),这样就排除了存在于eng_tc的eo、tc组合。
内容的提问来源于stack exchange,提问作者Саят Оразов
相关产品推荐
相关产品推荐

