SQLITE CTE限制(相关子征服)

发布于 2025-01-25 15:03:28 字数 2165 浏览 2 评论 0原文

我很困惑为什么相关的子查询在SQL中效果很好,但是与依赖关系模仿相同逻辑的CTE是错误的,错误地说“ XYZ CTE不存在”。

错误消息:在数据库“ bb_data”上执行SQL查询时的错误:没有这样的表:CTE2

我当然可以将其持续到某种程度上,但是这些是暂时的转换,因此我为什么选择了CTE。

相关的子查询方法可以正常工作

SELECT * ,
arrival_year||"-"||month_transformed||"-"||day_transformed as arrival_date
FROM(

SELECT *,
CASE WHEN length(arrival_month_numeric) =1 THEN "0"||arrival_month_numeric ELSE arrival_month_numeric END as month_transformed,
CASE WHEN length(arrival_date_day_of_month) =1 THEN "0"||arrival_date_day_of_month ELSE arrival_date_day_of_month END as day_transformed
FROM
(
SELECT *,
CASE 
WHEN arrival_month = 'January'  THEN 1
WHEN arrival_month = 'February'  THEN 2
WHEN arrival_month = 'March'  THEN 3
WHEN arrival_month = 'April'  THEN 4
WHEN arrival_month = 'May'  THEN 5
WHEN arrival_month = 'June'  THEN 6
WHEN arrival_month = 'July'  THEN 7
WHEN arrival_month = 'August'  THEN 8
WHEN arrival_month = 'September'  THEN 9
WHEN arrival_month = 'October'  THEN 10
WHEN arrival_month = 'November'  THEN 11
WHEN arrival_month = 'December'  THEN 12
ELSE 0 END as arrival_month_numeric
FROM
booking_table))

CTE方法

WITH CTE1 AS(
SELECT *,
    CASE 
    WHEN arrival_month = 'January'  THEN 1
    WHEN arrival_month = 'February'  THEN 2
    WHEN arrival_month = 'March'  THEN 3
    WHEN arrival_month = 'April'  THEN 4
    WHEN arrival_month = 'May'  THEN 5
    WHEN arrival_month = 'June'  THEN 6
    WHEN arrival_month = 'July'  THEN 7
    WHEN arrival_month = 'August'  THEN 8
    WHEN arrival_month = 'September'  THEN 9
    WHEN arrival_month = 'October'  THEN 10
    WHEN arrival_month = 'November'  THEN 11
    WHEN arrival_month = 'December'  THEN 12
    ELSE 0 END as arrival_month_numeric
    FROM
    booking_table),

    CTE2 AS(
    SELECT *,
        CASE WHEN length(arrival_month_numeric) =1 THEN "0"||arrival_month_numeric ELSE arrival_month_numeric END as month_transformed,
        CASE WHEN length(arrival_date_day_of_month) =1 THEN "0"||arrival_date_day_of_month ELSE arrival_date_day_of_month END as day_transformed
    FROM CTE1)
    
    SELECT * FROM CTE2;

I'm confused why Correlated Sub Queries work fine in SQL, but CTE's that emulate the same logic with dependencies, throw an error that says 'XYZ CTE doesn't exist'.

Error message: Error while executing SQL query on database 'BB_Data': no such table: CTE2

I could of course persist these to a view, but these are temporary transformations hence why I've chosen a CTE.

Correlated Sub Query Approach which works fine

SELECT * ,
arrival_year||"-"||month_transformed||"-"||day_transformed as arrival_date
FROM(

SELECT *,
CASE WHEN length(arrival_month_numeric) =1 THEN "0"||arrival_month_numeric ELSE arrival_month_numeric END as month_transformed,
CASE WHEN length(arrival_date_day_of_month) =1 THEN "0"||arrival_date_day_of_month ELSE arrival_date_day_of_month END as day_transformed
FROM
(
SELECT *,
CASE 
WHEN arrival_month = 'January'  THEN 1
WHEN arrival_month = 'February'  THEN 2
WHEN arrival_month = 'March'  THEN 3
WHEN arrival_month = 'April'  THEN 4
WHEN arrival_month = 'May'  THEN 5
WHEN arrival_month = 'June'  THEN 6
WHEN arrival_month = 'July'  THEN 7
WHEN arrival_month = 'August'  THEN 8
WHEN arrival_month = 'September'  THEN 9
WHEN arrival_month = 'October'  THEN 10
WHEN arrival_month = 'November'  THEN 11
WHEN arrival_month = 'December'  THEN 12
ELSE 0 END as arrival_month_numeric
FROM
booking_table))

CTE Approach

WITH CTE1 AS(
SELECT *,
    CASE 
    WHEN arrival_month = 'January'  THEN 1
    WHEN arrival_month = 'February'  THEN 2
    WHEN arrival_month = 'March'  THEN 3
    WHEN arrival_month = 'April'  THEN 4
    WHEN arrival_month = 'May'  THEN 5
    WHEN arrival_month = 'June'  THEN 6
    WHEN arrival_month = 'July'  THEN 7
    WHEN arrival_month = 'August'  THEN 8
    WHEN arrival_month = 'September'  THEN 9
    WHEN arrival_month = 'October'  THEN 10
    WHEN arrival_month = 'November'  THEN 11
    WHEN arrival_month = 'December'  THEN 12
    ELSE 0 END as arrival_month_numeric
    FROM
    booking_table),

    CTE2 AS(
    SELECT *,
        CASE WHEN length(arrival_month_numeric) =1 THEN "0"||arrival_month_numeric ELSE arrival_month_numeric END as month_transformed,
        CASE WHEN length(arrival_date_day_of_month) =1 THEN "0"||arrival_date_day_of_month ELSE arrival_date_day_of_month END as day_transformed
    FROM CTE1)
    
    SELECT * FROM CTE2;

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文