我正在尝试执行看似简单的请求包含WITH
子句:
WITH sub AS (SELECT url FROM site WHERE id = 15)
SELECT * FROM search_result WHERE url = sub.url
但它不起作用。我明白了
错误:缺少表“sub”的 FROM 子句条目
怎么了?
我正在尝试执行看似简单的请求包含WITH
子句:
WITH sub AS (SELECT url FROM site WHERE id = 15)
SELECT * FROM search_result WHERE url = sub.url
但它不起作用。我明白了
错误:缺少表“sub”的 FROM 子句条目
怎么了?
对于这种简单的情况,根本不要使用 CTE。与您似乎期望的不同,以下没有CTE 的简单查询会稍微快一些:
SELECT r.*
FROM search_result r
JOIN site s USING (url)
WHERE s.id = 15;
测试EXPLAIN ANALYZE
以验证。
CTE 引入了优化障碍。它们有很多很好的用途,但它们不会使简单的查询更快。这是一个关于 pgsql-performance 的线程,它为您提供了更多关于为什么会这样的细节。
表表达式需要像表一样使用。您正在尝试将 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
您可以轻松地进行内部连接:
SELECT search_result .*
FROM
search_result
INNER JOIN
(SELECT url FROM site WHERE id = 15) as st
ON
search_result.url = st.url
这会进行过滤,以便您加入比在过滤之外执行 where 子句更小的集合。在您的情况下,这可能无关紧要,但这是需要考虑的事情。
这不是使用 CTE 的正确方法:
With sub as (
SELECT url
FROM site
WHERE id = 15
)
SELECT *
FROM Search_Result SR
JOIN sub ON SR.url = sub.Url