PL/SQL中用LEFT JOIN替换NOT IN实现删除操作报错求助
PL/SQL删除语句语法问题解答
你尝试的LEFT JOIN写法在PL/SQL(Oracle)中语法不合法,因为Oracle的DELETE语句不支持直接在FROM子句后紧跟JOIN操作,这就是报错syntax error near at or near "LEFT"的原因。
正确的等价写法
1. 用NOT EXISTS替代NOT IN(推荐,逻辑更可靠)
原来的NOT IN语句存在潜在问题:如果tableB.c_id包含NULL值,NOT IN会因为NULL的逻辑判断特性(任何值与NULL比较结果为UNKNOWN)导致没有数据被删除。改用NOT EXISTS可以避免这个问题,写法如下:
DELETE FROM tableA a WHERE NOT EXISTS ( SELECT 1 FROM tableB b WHERE b.c_id = a.id );
2. 基于LEFT JOIN逻辑的子查询删除
如果一定要沿用LEFT JOIN的思路,可以通过子查询包装关联结果来实现,注意需要保证tableA有主键,或者关联后的子查询每行对应tableA的唯一行,否则会报错:
DELETE FROM ( SELECT a.* FROM tableA a LEFT JOIN tableB b ON a.id = b.c_id WHERE b.c_id IS NULL );
补充说明
你原来的NOT IN语句可以简化为DELETE FROM tableA WHERE id NOT IN (SELECT c_id FROM tableB),因为子查询里的tableB.c_id = tableA.id条件是冗余的,NOT IN本身就是判断id是否不在子查询返回的c_id集合中。
内容的提问来源于stack exchange,提问作者Franqo Balsamo
相关产品推荐
相关产品推荐

