【问题标题】:issue with SELECT inside WHERE clause postgresWHERE 子句 postgres 中的 SELECT 问题
【发布时间】:2018-09-12 06:52:01
【问题描述】:

我正在尝试使用这些命令创建一个表:

SELECT
    data_req,
    count(servico) as qtdeServico,
    count(metodo) as qtdeMetodo,
    consumerid,
    metodo,
    status_metodo,
    servico,
    sum(tempo_req)
INTO
    consolidado
FROM 
    requisicoes AS r
WHERE 
    r.data_req > SELECT MAX(c.data_req) FROM consolidado c  
GROUP BY 
    data_req, consumerid, metodo, status_metodo, servico;

不幸的是,我在 where 的 select 子句中遇到错误。我正在使用 postgres。

有什么建议吗?提前致谢。

【问题讨论】:

  • where子句中的子查询不应该用括号括起来吗?
  • 查询没有意义。您似乎正在尝试创建一个名为 consolidado 的表,同时还从同一个表中进行选择。样本数据和期望的结果真的很有帮助。

标签: sql postgresql


【解决方案1】:

您的查询有很多特点。以下将是更正确的语法:

create table consolidado as 
    select data_req, count(servico) as qtdeServico, count(metodo) as qtdeMetodo,
           consumerid, metodo, status_metodo, servico,
           sum(tempo_req) as sum_tempo_req
    from requisicoes r
    where r.data_req > (select max(c.data_req) from consolidado c) 
    group by data_req, consumerid, metodo, status_metodo, servico;

这修复了以下错误:

  • Postgres 推荐 CREATE TABLE AS 而不是 SELECT INTO(请参阅 here)。
  • 创建表时所有列都应命名。
  • 您需要围绕子查询使用括号。

但是,查询没有意义。它正在创建一个名为consolidado 的表,并从表中读取。这在逻辑上很麻烦。此外,qtMetodoqtdeServico 通常具有相同的值——它们位于GROUP BY 列中,这意味着它们是按组分隔的。

【讨论】:

    【解决方案2】:

    尝试用“(....)”包围 SELECT 语句:

    SELECT
        data_req,
        count(servico) as qtdeServico,
        count(metodo) as qtdeMetodo,
        consumerid,
        metodo,
        status_metodo,
        servico,
        sum(tempo_req)
        into consolidado
        FROM requisicoes as r
        WHERE 
        r.data_req > (select max(c.data_req) from consolidado c  
        GROUP BY data_req, consumerid, metodo, status_metodo, servico);
    

    【讨论】:

      【解决方案3】:

      假设consolidado 已经存在。您将需要使用INSERT INTO ()... SELECT 语法。子查询也应该在括号内:

      INSERT INTO consolidado (data_req, qtdeServico.. rest of cols)
      SELECT
          data_req,
          count(servico) as qtdeServico,
          count(metodo) as qtdeMetodo,
          consumerid,
          metodo,
          status_metodo,
          servico,
          sum(tempo_req)
      FROM requisicoes as r
      WHERE r.data_req > (select max(c.data_req) from consolidado c)
      GROUP BY data_req, consumerid, metodo, status_metodo, servico;
      

      【讨论】:

        【解决方案4】:

        除了其他人关于CREATE TABLE AS vs SELECT INTO 的观点之外,我强烈建议您查看CREATE MATERIALIZED VIEW,这听起来更像您想要的......

        【讨论】:

          猜你喜欢
          • 2013-04-06
          • 1970-01-01
          • 1970-01-01
          • 2014-04-04
          • 1970-01-01
          • 2016-04-23
          • 2022-09-24
          • 2019-06-02
          • 1970-01-01
          相关资源
          最近更新 更多