多匹配场景下如何实现LEFT JOIN,查询tab1表中未匹配的记录
问题原因
你原有写法的错误在于LEFT JOIN仅通过valA单字段关联:同一个valA下可能存在部分行匹配规则、部分行不匹配的情况,未匹配的tab1行会关联到同valA的已匹配tog行,导致WHERE tog.val1 IS NULL无法正确过滤出未匹配记录。
解决方案
方案1:用NOT EXISTS直接判断(推荐,逻辑更清晰,不需要提前生成tog表)
直接将你定义的3种匹配规则作为存在判断条件,查询未匹配的tab1记录:
SELECT t1.*, NULL AS val1, NULL AS val2, NULL AS val3, NULL AS val4 FROM tab1 t1 WHERE NOT EXISTS ( SELECT 1 FROM tab2 t2 WHERE -- 对应3种匹配规则,满足任意一种就算匹配成功 (t1.ValA = t2.Val1 AND t1.ValB = t2.Val2) OR (t1.ValA = t2.Val1 AND t1.ValB <> t2.Val2 AND t1.ValD = t2.Val4) OR (t1.ValA = t2.Val1 AND t1.ValC = t2.Val3 AND t1.ValD <> t2.Val4) )
方案2:基于已有的tog表查询
如果需要复用你已经写好的tog表逻辑,需要把tab1和tog的4个原始字段全关联(tog中的valA/valB/valC/valD就是原tab1的匹配行字段):
SELECT t1.*, NULL AS val1, NULL AS val2, NULL AS val3, NULL AS val4 FROM tab1 t1 LEFT JOIN tog t ON t1.valA = t.valA AND t1.valB = t.valB AND t1.valC = t.valC AND t1.valD = t.valD WHERE t.valA IS NULL
两种方案都可以得到你期望的结果。
内容的提问来源于stack exchange,提问作者Yokanishaa
相关产品推荐
相关产品推荐

