【问题标题】:How to write a SQL DELETE statement using a SELECT on a JOIN如何在 JOIN 上使用 SELECT 编写 SQL DELETE 语句
【发布时间】:2015-01-27 19:08:22
【问题描述】:

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

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

感谢收看!

【问题讨论】:

  • 不直接相关,但'01.01.2013' 是文字而非日期。永远不要依赖隐式数据类型转换。

标签: sql oracle11g


【解决方案1】:

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

【讨论】:

  • 谢谢!那里的出色工作和一些非常有用的信息:)
【解决方案2】:

你可以试试这样的想法:

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')

【讨论】:

  • 干杯,非常感谢!
猜你喜欢
  • 2013-07-07
  • 2012-10-18
  • 2022-08-15
  • 2018-02-27
  • 2013-10-30
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 2013-06-11
相关资源
最近更新 更多