Snowflake使用DELETE关联LEFT JOIN删除数据出现语法错误如何解决?
你遇到的语法报错是因为你使用的是MySQL特有的DELETE JOIN写法,PostgreSQL、Snowflake、SQL Server等大多数数据库不支持在DELETE关键字后直接跟随表别名,也不支持直接在FROM子句后写JOIN语句实现关联删除。
另外你原代码中使用LEFT JOIN后又加了b."X" = 'X'的过滤条件,实际等价于INNER JOIN,不需要用LEFT JOIN。
方案1:全数据库通用写法(推荐)
使用EXISTS子查询实现关联删除,兼容所有主流SQL数据库,不会出现语法兼容问题:
DELETE FROM "table1" a WHERE EXISTS ( SELECT 1 FROM "table2" b WHERE a."x" = b."x" AND b."x" = 'X' );
如果确定table2的x字段没有重复值和NULL值,也可以用IN子查询:
DELETE FROM "table1" WHERE "x" IN ( SELECT "x" FROM "table2" WHERE "x" = 'X' );
方案2:适配PostgreSQL/Snowflake的写法
如果你使用的是PostgreSQL或者Snowflake,可以用USING子句实现关联删除:
DELETE FROM "table1" a USING "table2" b WHERE a."x" = b."x" AND b."x" = 'X';
方案3:适配SQL Server的写法
如果你使用的是SQL Server,调整原代码的结构即可:
DELETE a FROM "table1" a INNER JOIN "table2" b ON a."x" = b."x" WHERE b."x" = 'X';
内容的提问来源于stack exchange,提问作者lime
相关产品推荐
相关产品推荐

