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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用具有多个语句的单个公用表表达式相关的知识,希望对你有一定的参考价值。

数据库

DB2

脚本

我必须得到IDs和DELETE 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或尽可能简化查询。

答案

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

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

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

以上是关于使用具有多个语句的单个公用表表达式的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 公用表表达式(CTE)实现递归

SQL Server 公用表表达式(CTE)实现递归

SQL-CTE公用表达式

Hive 公用表表达式 CTE 使用指南

SQL递归查询知多少

在 Android 中使用具有多个布局的单个片段