使用内部联接删除 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的主要内容,如果未能解决你的问题,请参考以下文章