使用内部联接删除 DB2

Posted

技术标签:

【中文标题】使用内部联接删除 DB2【英文标题】:DB2 Delete with Inner Joins 【发布时间】: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 专家,但我确实找到了这个,它提供了一个潜在的解决方案:***.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... 【参考方案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'
             );

【讨论】:

以上是关于使用内部联接删除 DB2的主要内容,如果未能解决你的问题,请参考以下文章

使用内部联接删除一行数据[重复]

使用内部联接删除

Db2 中的嵌套联接

使用多个内部联接时,与使用单个内部联接时相比,我得到不同的结果

内部联接与内部联接(SELECT . FROM)

内部联接和简单联接之间是不是有任何性能差异? [复制]