SQLITE CTE限制(相关子征服)
我很困惑为什么相关的子查询在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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论