【问题标题】:SQL WITH clause doesn't workSQL WITH 子句不起作用
【发布时间】:2013-05-28 17:42:43
【问题描述】:

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

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

但它不起作用。我明白了

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

怎么了?

【问题讨论】:

  • 你的 Postgres 版本?
  • 使用with子句有什么要求吗?
  • 我的 PostgreSQL 版本是 9.1
  • @Ryan Gates 是的,WITH 子句需要使用。我真正的查询要复杂得多和令人困惑。所以我试图执行这个简单的请求,以了解它应该如何使用以及它有什么问题。
  • 对问题中的逻辑使用WITH 子句和内连接有什么区别?还是你省略的逻辑?

标签: sql postgresql postgresql-9.1 with-statement


【解决方案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

【讨论】:

    【解决方案2】:

    不要在这个简单的案例中使用 CTE。 与您似乎期望的不同,以下简单查询没有 CTE 会稍微更快

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

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

    CTE 引入了优化障碍。它们有很多很好的用途,但它们不会使简单的查询更快。 这是thread on pgsql-performance,它为您提供了有关原因的更多详细信息。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        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-13
          • 2015-05-24
          • 2015-01-27
          • 2017-04-12
          • 1970-01-01
          • 2019-04-06
          • 1970-01-01
          • 2022-11-24
          • 1970-01-01
          相关资源
          最近更新 更多