使用具有多个语句的单个公用表表达式

时间:2018-03-02 15:13:25

标签: sql db2

数据库

db2的

方案

我必须得到IDDELETE FROM...两个表的列表。我从CTE获得了所有ID,但我只能在一个DELETE语句中使用它。我必须再次查询CTE以查找其他DELETE

当前解决方案

-- GET A LIST OF ALL CHILDREN OF A NODE, INCLUDING A NODE
WITH NODE_LIST (ID) AS
(
    -- CHILDREN
    SELECT n.ID FROM NODE n WHERE n.ID = '8ae433156f7f4469857e7de205ec4fe0'
    UNION ALL
    SELECT n.ID FROM NODE n, NODE_LIST nl WHERE nl.ID = n.PARENT
)
SELECT COUNT (*) FROM OLD TABLE(
    DELETE FROM FIRST_NODE_TABLE ns WHERE EXISTS (SELECT * FROM NODE_LIST nl WHERE nl.ID = ns.CHILD OR nl.ID = ns.PARENT)
);

WITH NODE_LIST (ID) AS
(
    SELECT n.ID FROM NODE n WHERE n.ID = '8ae433156f7f4469857e7de205ec4fe0'
    UNION ALL
    SELECT n.ID FROM NODE n, NODE_LIST nl WHERE nl.ID = n.PARENT
)

SELECT COUNT (*) FROM OLD TABLE(
    DELETE FROM SECOND_NODE_TABLE n WHERE EXISTS (SELECT * FROM NODE_LIST nl WHERE nl.ID = n.ID)
);

请求

我希望只有一个NODE_LIST或尽可能简化查询。

1 个答案:

答案 0 :(得分:0)

https://www.ibm.com/support/knowledgecenter/en/SSEPEK_10.0.0/apsg/src/tpc/db2z_createcte.html说:

  

您可以在CREATE VIEW语句中的fullselect之前使用公用表表达式。如果需要在多个查询中使用公用表表达式的结果,则此方法很有用。

我读到这意味着除非您创建视图,否则只能在您定义它的查询中使用CTE。