0

我正在尝试执行看似简单的请求包含WITH子句:

WITH sub AS (SELECT url FROM site WHERE id = 15) 
SELECT * FROM search_result WHERE url = sub.url

但它不起作用。我明白了

错误:缺少表“sub”的 FROM 子句条目

怎么了?

4

4 回答 4

1

对于这种简单的情况,根本不要使用 CTE。与您似乎期望的不同,以下没有CTE 的简单查询会稍微一些:

SELECT r.*
FROM   search_result r
JOIN   site s USING (url)
WHERE  s.id = 15;

测试EXPLAIN ANALYZE以验证。

CTE 引入了优化障碍。它们有很多很好的用途,但它们不会使简单的查询更快。这是一个关于 pgsql-performance 的线程,它为您提供了更多关于为什么会这样的细节。

于 2013-05-28T23:15:43.343 回答
1

表表达式需要像表一样使用。您正在尝试将 sub 的值用作标量。

试试这个(原谅我,Postgres 不是我的第一个 SQL 方言)。

WITH sub AS (SELECT url FROM site WHERE id = 15) 
SELECT * FROM sub
INNER JOIN
 search_result 
ON
  sub.url = search_result.url

编辑,或者,您可以跳过 WITH 子句并使用:-

SELECT * FROM 
  site
INNER JOIN
  search_result 
ON
  site.url = search_result.url
WHERE 
  site.id = 15
于 2013-05-28T17:46:53.997 回答
0

您可以轻松地进行内部连接:

SELECT search_result .* 
FROM
    search_result
INNER JOIN
    (SELECT url FROM site WHERE id = 15) as st
ON
    search_result.url = st.url

这会进行过滤,以便您加入比在过滤之外执行 where 子句更小的集合。在您的情况下,这可能无关紧要,但这是需要考虑的事情。

于 2013-05-28T17:55:03.813 回答
0

这不是使用 CTE 的正确方法:

With sub as (
    SELECT url
    FROM site
    WHERE id = 15
)
SELECT * 
FROM Search_Result SR 
   JOIN sub ON SR.url = sub.Url
于 2013-05-28T17:47:00.433 回答