SQL执行DELETE语句时INNER JOIN处报语法错误,如何排查原因?
错误根源分析
- 第一类错误:语法顺序错误
标准SQL的DELETE语句结构为DELETE FROM 表名 [JOIN/USING子句] [WHERE子句],你将INNER JOIN子句写在了WHERE子句之后,完全不符合语法规则,这是编译器直接报INNER位置语法错误的直接原因。 - 第二类错误:逻辑匹配错误
你的WHERE条件中写的是m.pers_nr IN (SELECT COUNT(*) AS count FROM kunde GROUP BY betreuer),这里IN子句返回的是每个员工负责的客户数量值,而pers_nr是员工编号字段,拿员工编号和客户数量做匹配逻辑完全不成立,即便语法修正后也无法得到你想要的结果。
修正后写法参考
从你的代码逻辑推测你要实现的是删除负责客户数量最少的员工,PostgreSQL环境下可以参考以下写法:
-- 写法1:用嵌套子查询实现,逻辑更直观 DELETE FROM mitarbeiter m WHERE m.pers_nr IN ( -- 拿到负责客户数等于最小客户数的员工编号 SELECT betreuer FROM kunde GROUP BY betreuer HAVING COUNT(*) = ( -- 拿到最小的客户负责数量 SELECT MIN(cust_count) FROM ( SELECT COUNT(*) AS cust_count FROM kunde GROUP BY betreuer ) AS count_list ) );
-- 写法2:用JOIN实现,对应你原本想用JOIN的思路 DELETE FROM mitarbeiter m USING ( -- 统计每个员工的负责客户数 SELECT betreuer, COUNT(*) AS cust_count FROM kunde GROUP BY betreuer ) AS staff_cust -- 关联拿到最小客户数 INNER JOIN ( SELECT MIN(cust_count) AS min_count FROM ( SELECT COUNT(*) AS cust_count FROM kunde GROUP BY betreuer ) AS t ) AS min_cust ON staff_cust.cust_count = min_cust.min_count WHERE m.pers_nr = staff_cust.betreuer;
报错信息翻译
原德语报错翻译为:
错误: 语法错误在「INNER」位置
第10行: INNER JOIN (SELECT COUNT(*) AS count FROM kunde GROUP B...
内容的提问来源于stack exchange,提问作者Makouru
相关产品推荐
相关产品推荐

