请选择 进入手机版 | 继续访问电脑版
 找回密码
 立即注册

QQ登录

只需一步,快速开始

PennyCheung

初级会员

8

主题

16

帖子

214

积分

初级会员

积分
214

[已处理] 视图如何写递归

PennyCheung
初级会员   /  发表于:2025-4-3 08:58  /   查看:79  /  回复:3
5金币
本帖最后由 PennyCheung 于 2025-4-9 13:43 编辑

下述SQL语句无法递归,点击确定时,会弹出编辑视图失败提示(如图片所示)请各位大佬帮忙解决一下!万分感激!


WITH MaterialQuantities AS (
    SELECT
        `月初bs在库`.`物料名称` AS `物料名称`,
        SUM(`月初bs在库`.`数量`) AS `数量`,
        '月初BS在库' AS `来源`
    FROM
        `月初bs在库`
    GROUP BY
        `月初bs在库`.`物料名称`
    UNION ALL
    SELECT
        `月初发注残`.`物料名称` AS `物料名称`,
        SUM(`月初发注残`.`数量`) AS `数量`,
        '月初发注残' AS `来源`
    FROM
        `月初发注残`
    GROUP BY
        `月初发注残`.`物料名称`
    UNION ALL
    SELECT
        `月初手配残`.`物料名称` AS `物料名称`,
        SUM(`月初手配残`.`数量`) AS `数量`,
        '月初手配残' AS `来源`
    FROM
        `月初手配残`
    GROUP BY
        `月初手配残`.`物料名称`
    UNION ALL
    SELECT
        `月初订单残`.`物料名称` AS `物料名称`,
        SUM(`月初订单残`.`数量`) AS `数量`,
        '月初订单残' AS `来源`
    FROM
        `月初订单残`
    GROUP BY
        `月初订单残`.`物料名称`
    UNION ALL
    SELECT
        `月初工程内在库`.`物料名称` AS `物料名称`,
        SUM(`月初工程内在库`.`数量`) AS `数量`,
        '月初工程内在库' AS `来源`
    FROM
        `月初工程内在库`
    GROUP BY
        `月初工程内在库`.`物料名称`
    UNION ALL
    SELECT
        `月初生管仓在库`.`物料名称` AS `物料名称`,
        SUM(`月初生管仓在库`.`数量`) AS `数量`,
        '月初生管仓在库' AS `来源`
    FROM
        `月初生管仓在库`
    GROUP BY
        `月初生管仓在库`.`物料名称`
),
PivotTable AS (
    SELECT
        `materialquantities`.`物料名称` AS `物料名称`,
        SUM(CASE WHEN `materialquantities`.`来源` = '月初BS在库' THEN `materialquantities`.`数量` ELSE 0 END) AS `月初BS在库数量`,
        SUM(CASE WHEN `materialquantities`.`来源` = '月初发注残' THEN `materialquantities`.`数量` ELSE 0 END) AS `月初发注残数量`,
        SUM(CASE WHEN `materialquantities`.`来源` = '月初手配残' THEN `materialquantities`.`数量` ELSE 0 END) AS `月初手配残数量`,
        SUM(CASE WHEN `materialquantities`.`来源` = '月初订单残' THEN `materialquantities`.`数量` ELSE 0 END) AS `月初订单残数量`,
        SUM(CASE WHEN `materialquantities`.`来源` = '月初工程内在库' THEN `materialquantities`.`数量` ELSE 0 END) AS `月初工程内在库数量`,
        SUM(CASE WHEN `materialquantities`.`来源` = '月初生管仓在库' THEN `materialquantities`.`数量` ELSE 0 END) AS `月初生管仓在库数量`
    FROM
        `materialquantities`
    GROUP BY
        `materialquantities`.`物料名称`
),
RecursiveCTE AS (
    -- 初始查询:获取级别为 2、3、4、5 且上级类目等于 ID 的记录
    SELECT
        `组立制造bom`.`品目编码`,
        `组立制造bom`.`ID`,
        `组立制造bom`.`级别`,
        `组立制造bom`.`上级类目`,
        `组立制造bom`.`使用量`,
        `组立制造bom`.`良品率`,
        `组立制造bom`.`开料数`,
        `pivottable`.`物料名称`,
        `pivottable`.`月初BS在库数量`,
        `pivottable`.`月初发注残数量`,
        `pivottable`.`月初手配残数量` AS current_月初手配残数量,
        `pivottable`.`月初订单残数量` AS current_月初订单残数量,
        `pivottable`.`月初工程内在库数量` AS current_月初工程内在库数量,
        `pivottable`.`月初生管仓在库数量` AS current_月初生管仓在库数量
    FROM
        `组立制造bom`
    LEFT JOIN
        `pivottable` ON `组立制造bom`.`品目编码` = `pivottable`.`物料名称`
    WHERE
        `组立制造bom`.`级别` IN (2, 3, 4, 5) AND `组立制造bom`.`上级类目` = `组立制造bom`.`ID`
    UNION ALL
    -- 递归部分:查找下级记录
    SELECT
        `组立制造bom`.`品目编码`,
        `组立制造bom`.`ID`,
        `组立制造bom`.`级别`,
        `组立制造bom`.`上级类目`,
        `组立制造bom`.`使用量`,
        `组立制造bom`.`良品率`,
        `组立制造bom`.`开料数`,
        `pivottable`.`物料名称`,
        `pivottable`.`月初BS在库数量`,
        `pivottable`.`月初发注残数量`,
        parent.current_月初手配残数量 AS current_月初手配残数量,
        parent.current_月初订单残数量 AS current_月初订单残数量,
        parent.current_月初工程内在库数量 AS current_月初工程内在库数量,
        parent.current_月初生管仓在库数量 AS current_月初生管仓在库数量
    FROM
        `组立制造bom`
    JOIN
        RecursiveCTE parent ON `组立制造bom`.`上级类目` = parent.`ID`
    LEFT JOIN
        `pivottable` ON `组立制造bom`.`品目编码` = `pivottable`.`物料名称`
)
SELECT
    `品目编码`,
    `ID`,
    `级别`,
    `上级类目`,
    `使用量`,
    `良品率`,
    `开料数`,
    `物料名称`,
    `月初BS在库数量`,
    `月初发注残数量`,
    current_月初手配残数量 AS `月初手配残数量`,
    current_月初订单残数量 AS `月初订单残数量`,
    current_月初工程内在库数量 AS `月初工程内在库数量`,
    current_月初生管仓在库数量 AS `月初生管仓在库数量`
FROM
    RecursiveCTE


附件: 您需要 登录 才可以下载或查看,没有帐号?立即注册

3 个回复

倒序浏览
olookok活字格认证
论坛元老   /  发表于:2025-4-3 09:38:52
沙发
让 ai 帮你检查一下 看是否写的有问题。
回复 使用道具 举报
PennyCheung
初级会员   /  发表于:2025-4-3 11:08:14
板凳
olookok 发表于 2025-4-3 09:38
让 ai 帮你检查一下 看是否写的有问题。

检查过了,是没问题的
回复 使用道具 举报
Grayson.Shang活字格认证 Wyn认证
超级版主   /  发表于:2025-4-3 18:00:17
地板
大佬您好,咱们的数据库是什么恶数据库,咱们可以查一下,数据库是否有大小写敏感,以及在SQL中,创建的这种临时表,是否存在大小写敏感。

若是大小写敏感,咱们可以将使用_分隔,这样再测试一下试试。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部