sql - 不能从查询中引用 CTE?
问题描述
我对 SQL(这里是 PostgreSQL)比较陌生,并且停留在我一直在处理的查询上。我为它创建了一个 MWE:我在 处得到一个语法错误new_years
,但我没有看到任何原因:
WITH new_years AS
(
SELECT mov_year FROM movie WHERE mov_year > 2000
)
SELECT m.mov_title, m.mov_year
FROM movie m, new_years
WHERE m.mov_year IN new_years;
然后我尝试重新格式化我的查询,也不明白为什么重新格式化不起作用,因为new_years
找不到!为什么可以在中引用movie的别名m WHERE
,而别名new_years却不能?有些别名与其他别名不同吗?
SELECT m.mov_title, m.mov_year
FROM movie m, (SELECT mov_year FROM movie WHERE mov_year > 2000) AS new_years
WHERE m.mov_year IN new_years;
非常感谢你的帮助!
解决方案
IN
需要引用值列表,而不是 CTE。
这在语法上是正确的......
WHERE m.mov_year IN (SELECT mov_year FROM new_years);
它似乎也会给出胡言乱语的结果。
也许你的意思是...
WITH new_years AS
(
SELECT DISTINCT mov_year FROM movie WHERE mov_year > 2000
)
SELECT
m.mov_title, m.mov_year
FROM
movie m
INNER JOIN
new_years
ON new_years.mov_year = m.mov_year
或者...
WITH new_years AS
(
SELECT DISTINCT mov_year FROM movie WHERE mov_year > 2000
)
SELECT
m.mov_title, m.mov_year
FROM
movie m
WHERE
m.mov_year IN (SELECT mov_year FROM new_years);
但是,为什么不这样做呢?
SELECT
m.mov_title, m.mov_year
FROM
movie m
WHERE
m.mov_year > 2000
推荐阅读
- sql - SQL Server 2016 时间点复制工具
- haskell - 更新并返回字符串列表
- c++ - 我需要帮助为我的零钱计算器解决数学问题
- stream - 如何以阻塞方式有效地提取 futures::Stream 的第一个元素?
- python - Python:为什么这两个赋值会导致不同的结果?
- android - Androidx RecyclerView GridLayoutManager 无法转换为 LayoutManager
- c - C 到 MIPS 的翻译:冒泡排序
- ravendb - 仅当值尚不存在时,如何将值添加到集合中?
- c# - 将 .res 文件作为本机 win 32 资源嵌入到 c# 应用程序中
- string - String.split 没有在 Kotlin 中编译?