首页 > 解决方案 > 不能从查询中引用 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;

非常感谢你的帮助!

标签: sqlpostgresql

解决方案


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

推荐阅读