【问题标题】:Reuse of select query result oracle复用select查询结果oracle
【发布时间】:2016-08-08 14:47:15
【问题描述】:

我有以下查询

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]

现在,我想从我的数据库中删除该列表中所有位置的所有 id。这不仅是 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中是否可以重用这样的结果?

【问题讨论】:

  • 创建一个临时表并将不需要的 id 存储在那里。
  • 如果所有这些表都通过此 ID 作为 FK 关联,听起来您应该将它们配置为级联删除。否则,将查询结果插入临时表,然后从所有删除调用中引用它。
  • 使用@MathewsMathai 提到的Oracle 解决方案,您甚至不需要创建新类型。您可以使用现有的 Oracle 类型,例如 KU$_OBJNUMSET

标签: sql oracle


【解决方案1】:

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

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
);

当您到达玩具桌和果酱桌时,您需要一个临时桌,正如@Gordon 建议的那样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多