2016-08-08 127 views
0

我有以下查询重用选择查询结果的Oracle

SELECT ID FROM MARMELADES mrm 
where not exists 
    (SELECT 1 FROM TOYS toys 
    WHERE mrm.ID = toys.ID 
    AND mrm.INGREDIENT = toys.INGREDIENT 
    AND mrm.BOX_TYPE = 2) 
AND mrm.BOX_TYPE = 2 

它返回几乎400多个ID的结果,例如[12, 33, 45, ... , 3405]

现在,我想删除这是从所有的IDS从我的数据库到处列出。这不仅是MARMELADES和玩具。此外,我有例如35 +表,我可以有这个ID)。

我会很高兴,如果这种查询可以像ALL_UNNEEDED_IDS一些功能提取这样我就可以这样使用它:

DELETE FROM ANOTHER_TABLE_1 WHERE ID IN (ALL_UNNEEDED_IDS) 
DELETE FROM ANOTHER_TABLE_2 WHERE ID IN (ALL_UNNEEDED_IDS) 
DELETE FROM ANOTHER_TABLE_3 WHERE ID IN (ALL_UNNEEDED_IDS) 
DELETE FROM ANOTHER_TABLE_4 WHERE ID IN (ALL_UNNEEDED_IDS) 
... 
DELETE FROM ANOTHER_TABLE_35 WHERE ID IN (ALL_UNNEEDED_IDS) 

这是可以做到在Oracle重用这样的结果?

+3

创建一个临时表并在其中存储不需要的ID。 –

+0

如果所有这些表都通过此ID作为FK进行关联,听起来像您应该将它们配置为级联删除。否则,将查询结果插入临时表中,然后从所有删除调用中引用该查询结果。 – OldProgrammer

+0

看看这个: http://stackoverflow.com/questions/9119465/how-to-reuse-a-large-query-without-repeating-it –

回答

0

在后续查询中使用第一个查询。 IE:

DELETE FROM ANOTHER_TABLE_1 WHERE ID IN (
    SELECT ID FROM MARMELADES mrm 
    where not exists 
     (SELECT 1 FROM TOYS toys 
     WHERE mrm.ID = toys.ID 
     AND mrm.INGREDIENT = toys.INGREDIENT 
     AND mrm.BOX_TYPE = 2) 
    AND mrm.BOX_TYPE = 2 
); 

当你到达玩具和marmelades表时,你需要一个临时持有人表格,正如@Gordon所示。