【问题标题】:DB2 Delete with Inner Joins使用内部联接删除 DB2
【发布时间】:2021-05-13 20:40:29
【问题描述】:

试图从其他表中存在匹配记录的表中删除。

我尝试了不同的变体,但这个返回:

SQL 错误 [42601]:[SQL0199] 不需要关键字 INNER。有效令牌:使用 SKIP WAIT WITH FETCH LIMIT ORDER WHERE OFFSET。

它基本上是一个跨库/跨数据库,但不能让 DB2 一起玩。如果我将删除替换为 SELECT *

,则 Select 可以正常工作
 DELETE a
  FROM INHOUSE.ANDREWCAT a
   INNER JOIN ERPLIB.SRBPRG b ON
   a.PSPRDC  = b.PGPRDC
   INNER JOIN ERPLIB.SRBRSD  c 
   ON 
    b.PGIRGP = c.RDSRTY 
   AND c.RDTOFI = a.EPNUM AND c.RDSRTY = c.RDWHAT 
   AND a.EPNUM = 'REM104'

【问题讨论】:

  • 我不是 DB2 专家,但我确实找到了这个,它提供了一个潜在的解决方案:stackoverflow.com/questions/13523373/…
  • 另一个想法可能是在架构级别解决这个问题。您可以使用级联删除,以便对一个表的删除会导致对具有外键链接的表进行删除。 ibm.com/docs/en/informix-servers/14.10/… 我以前在 Postgres 数据库中使用过这种东西,它也可能有一些缺点。通常,写入(删除)只能发生在单个主数据库上。删除将导致发生删除的表上的锁定。您一次获得足够的这些删除,您可能会意外锁定您的数据库。
  • 你有DELETE a FROM...。这不应该工作。试过SELECT之后,你是不是只剩它了?
  • @PM77-1 DELETE a 应该可以工作,因为它是一个别名。我也试过 DELETE FROM INHOUSE.ANDREWCAT INNER JOIN... 然后它不喜欢关键字 INNER。
  • 为什么加入? delete from table where exists...

标签: sql db2 sql-delete


【解决方案1】:

DB2 不支持您使用的语法。

改为:

DELETE INHOUSE.ANDREWCAT a
WHERE EXISTS (SELECT 1
              FROM ERPLIB.SRBPRG b JOIN
                   ERPLIB.SRBRSD  c 
                   ON b.PGIRGP = c.RDSRTY
              WHERE a.PSPRDC  = b.PGPRDC AND
                    c.RDTOFI = a.EPNUM AND
                    c.RDSRTY = c.RDWHAT AND
                    a.EPNUM = 'REM104'
             );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-21
    • 2014-06-10
    • 2014-04-19
    相关资源
    最近更新 更多