【问题标题】:DELETE from Oracle table with two self-referencing fields从具有两个自引用字段的 Oracle 表中删除
【发布时间】:2013-12-09 19:42:42
【问题描述】:

我要处理一张表如下(简化版):

  CREATE TABLE "CE2"."TABLE1" (
      "ID" NUMBER(38,0) NOT NULL ENABLE,
      "SOME_IMPORTANT_COLUMN" NUMBER(38,0) NOT NULL ENABLE,
      "NAME" VARCHAR2(80 BYTE) NOT NULL ENABLE,
      "TABLE1_1_FK" NUMBER(38,0),
      "TABLE1_2_FK" NUMBER(38,0),

      CONSTRAINT "PK_TABLE1" PRIMARY KEY ("ID", "SOME_IMPORTANT_COLUMN") ENABLE,
      CONSTRAINT "FK_TABLE1_1" FOREIGN KEY ("TABLE1_1_FK", "SOME_IMPORTANT_COLUMN") REFERENCES "CE2"."TABLE1" ("ID", "SOME_IMPORTANT_COLUMN") ENABLE,
      CONSTRAINT "FK_TABLE1_2" FOREIGN KEY ("TABLE1_2_FK", "SOME_IMPORTANT_COLUMN") REFERENCES "CE2"."TABLE1" ("ID", "SOME_IMPORTANT_COLUMN") ENABLE
  )

此表有一个复合主键和两个自引用字段。另外,请注意没有 CASCADE DELETE 行为。 给定一组主键,我想从该表中删除一些记录。 引用目标记录(将被删除)的子记录也必须被删除。

如果我只有一个自引用字段,例如 TABLE1_1_FK,我会这样写:

delete from table1 where (id, some_important_column) in (
    select id, some_important_column from table1
    start with (id, some_important_column) in ((1, 'b'), (2, 'd'))
    connect by TABLE1_1_FK = prior id 
)

请注意,架构无法更改,我会避免更改 CASCADE 行为(现在它是 NO ACTION)。

谢谢。

【问题讨论】:

  • 您是否尝试在 CONNECT BY 子句中添加 OR TABLE1_2_FK = PRIOR ID
  • connect by TABLE1_1_FK = prior id or TABLE1_2_FK = prior id
  • 感谢@BrankoDimitrijevic 和 GriffeyDog - 您的解决方案可以完成这项工作。在旁注中,我忘记了主键的复合性质,因此 CONNECT BY 子句现在看起来像:通过 (TABLE1_1_FK = 先前的 id 和 some_important_column = 先前的 some_important_column) 或 (TABLE1_2_FK = 先前的 id 和 some_important_column = 先前的 some_important_column) 连接.您能否发布一个答案以便我接受?

标签: sql oracle oracle11g


【解决方案1】:

您能否发布一个答案以便我接受?

给你:

您是否尝试在 CONNECT BY 子句中添加 OR TABLE1_2_FK = PRIOR ID

【讨论】:

    猜你喜欢
    • 2010-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-02
    • 2016-11-08
    • 1970-01-01
    相关资源
    最近更新 更多