我正在尝试执行看似简单的请求包含WITH
子句:
WITH sub AS (SELECT url FROM site WHERE id = 15)
SELECT * FROM search_result WHERE url = sub.url
但它不起作用。我得到了
错误:缺少表“sub”
的FROM子句条目
什么事?
答案 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子句的情况要小。在您的情况下,这可能无关紧要,但需要考虑。