首页 > 解决方案 > 跨多个表删除多行

问题描述

我在 DERBY db 中有如下一组表,其中 PAIR 行表示 PERSON 表中的多行,SUBGROUP 表示 PAIR 表中的多行,而 SUPERGROUP 表示 SUBGROUP 表中的多行。

<table>
        <name>SUPERGROUP</name>
        <column>
            <name>SUPERGROUPID</name>
        </column>
</table>


<table>
        <name>SUBGROUP</name>
        <column>
            <name>SUBGROUPID</name>
        </column>
        <column>
            <name> SUPERGROUPID </name>
        </column>
    </table>


<table>
        <name>PAIR</name>
        <column>
            <name>PERSONID1</name>
        </column>
        <column>
            <name>PERSONID2</name>
        </column>
        <column>
            <name> SUPERGROUPID </name>
        </column>
        <column>
            <name> SUBGROUPID </name>
        </column>
    </table>


<table>
        <name>PERSON</name>
        <column>
            <name>PERSONID</name>
        </column>
        <column>
            <name> SUPERGROUPID </name>
        </column>
        <column>
            <name> SUBGROUPID </name>
        </column>
    </table>

我希望能够删除一个 SUBGROUP 行以及该 SUBGROUP 和 SUBGROUP 的 SUPERGROUP 中的 PAIR 表和 PERSON 表中的所有条目(如果不同的超组中存在相同的子组 ID,则不希望删除行)。

我已经尝试执行之前帖子中描述的内部联接,如下所示,但 SQuirrel SQL 在 SUBGROUP 之后的命令上给出了 SQLState:42X01 ErrorCode:30000 语法错误。

DELETE FROM
  SUBGROUP,
  PAIR,
  PERSON USING SUBGROUP
  INNER JOIN PAIR
  INNER JOIN PERSON
WHERE
  SUBGROUP.SUBGROUPID = '1'
  AND SUBGROUP.SUBGROUPID = PAIR.SUBGROUPID
  AND SUBGROUP.SUBGROUPID = PERSON.SUBGROUPDID
  AND SUBGROUP.SUPERGROUPID = 'S1'
  AND SUBGROUP.SUPERGROUPID = PAIR.SUPERGROUPID
  AND SUBGROUP.SUPERGROUPID = PERSON.SUPERGROUPID

以上是正确的吗?有更好的方法吗?

此外,如果我有多个要删除的 SUBGROUP,有没有办法创建单个 SQL 语句。IE。我想删除 SUPERGROUP S1 中的子组 {1,2,3,4,7,10}?

今天,我在所有表中一次删除一行,但是在删除 1000 个 SUBGROUP 时,这花费的时间太长了。

标签: sqlderby

解决方案


我认为您正在寻找的解决方案是:

DELETE
  SUBGROUP T1,
  PAIR T2,
  PERSON T3
FROM T1
  INNER JOIN T2 ON (T1.SUBGROUPID = T2.SUBGROUPID AND T1.SUPERGROUPID = T2.SUPERGROUPID)
  INNER JOIN T3 ON (T1.SUBGROUPID = T3.SUBGROUPDID AND T1.SUPERGROUPID = T3.SUPERGROUPID)
WHERE
  T1.SUBGROUPID = '1'
  AND T1.SUPERGROUPID = 'S1'

推荐阅读