Oracle SQL查询:获取表A中与表B无匹配值的数据
解决Oracle SQL查询表A中无表B匹配记录的问题
原SQL返回空结果的核心问题:
- NOT EXISTS子查询没有关联表A和表B的匹配字段(比如ID),导致只要表B中有符合日期条件的记录,NOT EXISTS就判定为假,最终过滤掉所有表A的数据
- 子查询里的
date (:a)语法错误,缺少等于符号=
正确的查询写法
方法1:使用NOT EXISTS(推荐)
SELECT DISTINCT a.id, a."DESC" -- DESC是Oracle关键字,需用双引号包裹 FROM table_a a -- 避免用`table`作为表名,这是Oracle关键字,这里替换为table_a WHERE a.date = :a AND NOT EXISTS ( SELECT 1 -- 子查询只需判断存在性,用1更高效 FROM table_b b WHERE b.date = :a AND a.id = b.id -- 关联表A和表B的匹配字段(示例为ID) -- 若需同时匹配描述字段,可添加 AND a."DESC" = b."DESC" )
方法2:使用LEFT JOIN + IS NULL
SELECT DISTINCT a.id, a."DESC" FROM table_a a LEFT JOIN table_b b ON a.id = b.id AND b.date = :a WHERE a.date = :a AND b.id IS NULL -- 筛选出表B中无匹配的记录
关键注意事项
DESC是Oracle保留关键字,直接使用会报错,必须用双引号"DESC"包裹或给字段起别名(比如a."DESC" AS description)- 表名
table也是关键字,实际使用时建议更换为有意义的表名(比如table_a、table_b) - 匹配条件要明确:必须关联表A和表B中用来判定“匹配”的字段(示例中是ID,需匹配多字段可自行补充)
内容的提问来源于stack exchange,提问作者Aidas Dem
相关产品推荐
相关产品推荐

