【发布时间】: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) 连接.您能否发布一个答案以便我接受?