SQL WITH子句不起作用

时间:2013-05-28 17:42:43

标签: sql postgresql postgresql-9.1 with-statement

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

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

但它不起作用。我得到了

  

错误:缺少表“sub”

的FROM子句条目

什么事?

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

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

使用EXPLAIN ANALYZE进行测试以验证。

CTE引入 优化障碍 。它们具有许多非常好的用途,但它们不会更快地进行简单的查询。 这是一个thread on pgsql-performance,可以为您提供更多详细信息。

答案 2 :(得分:0)

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

With sub as (
    SELECT url
    FROM site
    WHERE id = 15
)
SELECT * 
FROM Search_Result SR 
   JOIN sub ON SR.url = sub.Url

答案 3 :(得分: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子句的情况要小。在您的情况下,这可能无关紧要,但需要考虑。