You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在WHILE循环中访问临时表报错Unrecognized name: table_name如何解决

问题分析与解决

报错原因

你在WHILE条件中直接使用table_name.start引用表列的写法不符合SQL语法规则:SQL不支持直接通过「表名.列名」的方式在条件表达式里直接读取表数据,你没有将表中对应行的start值提前查询赋值给变量,引擎无法识别你在表达式里写的table_name指代什么对象,所以抛出未识别名称的错误。

修复方案

方案1:调整循环逻辑(保留循环写法)

你需要先声明变量存储每次查询到的start值,同时可以提前获取表的总行数控制循环边界,避免非法越界查询,修正后代码如下:

CREATE TEMP TABLE `table_name` AS 
    SELECT 1 AS row, DATE_SUB(DATE_TRUNC(CURRENT_DATE('Europe/London'), WEEK(MONDAY)), INTERVAL 1 WEEK) AS start, DATE_TRUNC(CURRENT_DATE('Europe/London'), WEEK(MONDAY)) AS end_date_plus_one UNION ALL
    SELECT 2, DATE_SUB(DATE_TRUNC(CURRENT_DATE('Europe/London'), WEEK(MONDAY)), INTERVAL 2 WEEK), DATE_SUB(DATE_TRUNC(CURRENT_DATE('Europe/London'), WEEK(MONDAY)), INTERVAL 1 WEEK) UNION ALL
    SELECT 3, DATE_SUB(DATE_TRUNC(CURRENT_DATE('Europe/London'), WEEK(MONDAY)), INTERVAL 3 WEEK), DATE_SUB(DATE_TRUNC(CURRENT_DATE('Europe/London'), WEEK(MONDAY)), INTERVAL 2 WEEK) UNION ALL
    SELECT 4, DATE_SUB(DATE_TRUNC(CURRENT_DATE('Europe/London'), WEEK(MONDAY)), INTERVAL 4 WEEK), DATE_SUB(DATE_TRUNC(CURRENT_DATE('Europe/London'), WEEK(MONDAY)), INTERVAL 3 WEEK)
;

BEGIN
    DECLARE loopRow INT64 DEFAULT 1;
    DECLARE current_start DATE;
    -- 提前统计临时表总行数,控制循环边界
    DECLARE total_rows INT64 DEFAULT (SELECT COUNT(*) FROM `table_name`);

    WHILE loopRow <= total_rows DO
        -- 把对应行的start值赋值给变量后再操作
        SET current_start = (SELECT start FROM `table_name` WHERE row = loopRow);
        SELECT current_start AS week_start;
        SET loopRow = loopRow + 1;
    END WHILE;
END 

方案2:更高效的替代写法(无需循环)

如果你的需求只是输出所有start日期的列表,不需要在循环里处理额外逻辑,完全不需要写循环遍历,直接一条查询语句即可实现,执行效率远高于循环写法:

SELECT start FROM `table_name` ORDER BY row;

内容的提问来源于stack exchange,提问作者redditor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 00:30:04