如何在JOIN上使用SELECT编写SQL DELETE语句

时间:2015-01-27 10:54:10

标签: sql oracle11g

早上好,我正在尝试运行以下脚本但是我收到“ORA-00933 SQL命令未正确结束”错误任何人都可以看到我出错的地方:

delete tableA 
FROM tableA 
JOIN tableB
ON tableB.usi = tableA.usi
WHERE tableB.usc = 'ABC'
AND tableA.cfs = '01.01.2013'

感谢您的期待!

2 个答案:

答案 0 :(得分:2)

Oracle不支持DELETE语句的JOIN。您需要使用子查询

delete from tableA 
where exists (select *
              from tableb
              where tableB.usi = tableA.usi
              and tableB.usc = 'ABC'
              AND tableA.cfs = '01.01.2013');

DELETE语句的完整语法记录在手册中 https://docs.oracle.com/cd/E11882_01/server.112/e41084/statements_8005.htm#SQLRF01505


请注意,如果tableA.cfsDATE(或TIMESTAMP)列,则不应依赖隐式数据类型转换。 '01.01.2013'是字符串文字而不是日期。 Oracle将尝试将其转换为日期,但这可能会失败,具体取决于SQL客户端的NLS设置。最好使用明确的ansi日期文字:where cfs = DATE '2013-01-01'或使用to_date()函数:where cfs = to_date('01.01.2013', 'dd.mm.yyyy')

此外,Oracle的DATE列包含时间。因此,除非csf列中的所有日期都有时间00:00:00,否则该条件很可能与任何内容都不匹配。使用trunc(tablea.csf) = ...来删除"更安全日期列的时间部分(它没有真正删除它,只是将其设置为00:00:00

答案 1 :(得分:0)

您可以尝试以下内容:

delete tableA
    WHERE id IN (
       SELECT a.id
       FROM tableA a
       JOIN tableB b
       ON b.usi = a.usi
       WHERE b.usc = 'ABC'
       AND a.cfs = '01.01.2013')