AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 33760
Accepted
Martin Smith
Martin Smith
Asked: 2013-01-30 09:18:23 +0800 CST2013-01-30 09:18:23 +0800 CST 2013-01-30 09:18:23 +0800 CST

Qual é o resultado correto para esta consulta?

  • 772

Me deparei com esse quebra-cabeça nos comentários aqui

CREATE TABLE r (b INT);

SELECT 1 FROM r HAVING 1=1;

SQL Server e PostgreSQL retornam 1 linha.

MySQL e Oracle retornam zero linhas.

Qual é correto? Ou ambos são igualmente válidos?

sql-standard aggregate
  • 3 3 respostas
  • 894 Views

3 respostas

  • Voted
  1. Best Answer
    Kevin Cathcart
    2013-01-30T14:55:29+08:002013-01-30T14:55:29+08:00

    Pela norma:

    SELECT 1 FROM r HAVING 1=1
    

    significa

    SELECT 1 FROM r GROUP BY () HAVING 1=1
    

    Citação ISO/IEC 9075-2:2011 7.10 Regra de sintaxe 1 (Parte da definição da cláusula HAVING):

    Seja HCo <having clause>. Seja TEo <table expression>que imediatamente contém HC. Se TEnão contiver imediatamente um <group by clause>, então “ GROUP BY ()” está implícito. Seja To descritor da tabela definida pelo <group by clause> GBCimediatamente contido em TEe Rseja o resultado de GBC.

    Ok, isso está bem claro.


    Asserção: 1=1é condição de busca verdadeira. Não fornecerei nenhuma citação para isso.


    Agora

    SELECT 1 FROM r GROUP BY () HAVING 1=1
    

    é equivalente a

    SELECT 1 FROM r GROUP BY ()
    

    Citação ISO/IEC 9075-2:2011 7.10 Regra Geral 1:

    O <search condition>é avaliado para cada grupo de R. O resultado de <having clause>é uma tabela agrupada dos grupos de R para os quais o resultado de <search condition>é Verdadeiro.

    Lógica: Como a condição de busca é sempre verdadeira, o resultado é R, que é o resultado do agrupamento por expressão.


    O seguinte é um trecho das Regras Gerais de 7.9 (a definição do GRUPO POR CLÁUSULA)

    1) Se não <where clause>for especificado, Tseja o resultado do anterior <from clause>; caso contrário, Tseja o resultado do anterior <where clause>.

    2) Caso:

    a) Se não houver colunas de agrupamento, o resultado de <group by clause>é a tabela agrupada que consiste Tem seu único grupo.

    Assim podemos concluir que

    FROM r GROUP BY ()
    

    resulta em uma tabela agrupada, consistindo em um grupo, com zero linhas (já que R está vazio).


    Um trecho das Regras Gerais de 7.12, que define uma Especificação de Consulta (também conhecida como instrução SELECT):

    1) Caso:

    a) Se Tnão for uma tabela agrupada, então [...]

    b) Se Té uma tabela agrupada, então

    Caso:

    i) Se Ttiver 0 (zero) grupos, então seja TEMP uma tabela vazia.

    ii) Se Ttiver um ou mais grupos, então cada um <value expression>é aplicado a cada grupo de Trendimento de uma tabela TEMPde Mlinhas, onde Mé o número de grupos em T. A icoluna -th de TEMP contém os valores derivados da avaliação do i-th <value expression>. [...]

    2) Caso:

    a) Se <set quantifier> DISTINCTnão for especificado, o resultado de <query specification>é TEMP.

    Portanto, como a tabela possui um grupo, ela deve ter uma linha de resultado.

    Desta forma

    SELECT 1 FROM r HAVING 1=1
    

    deve retornar um conjunto de resultados de 1 linha.

    QED

    • 17
  2. ypercubeᵀᴹ
    2013-01-30T09:55:56+08:002013-01-30T09:55:56+08:00

    Quando há HAVINGcláusula, sem WHEREcláusula:

    SELECT 1 FROM r HAVING 1=1;
    

    ... então GROUP BY ()está implícito. Assim, a consulta deve ser equivalente a:

    SELECT 1 FROM r GROUP BY () HAVING 1=1;
    

    ... que deve agrupar todas as linhas da tabela em um grupo (mesmo que a tabela não tenha nenhuma linha - ainda é um grupo de 0 linhas) e retornar 1 linha. O HAVINGcom a Truecondição não deve ter nenhum efeito depois disso.


    De um ângulo diferente, quantas linhas uma consulta como esta deve retornar?

    SELECT COUNT(*), MAX(b) FROM r;
    

    Um, zero ou "zero ou um, dependendo se a mesa está vazia ou não"?

    Acho que uma linha, não importa quantas linhas rtenha.

    • 7
  3. a1ex07
    2013-01-30T09:45:00+08:002013-01-30T09:45:00+08:00

    Pelo que vejo, parece que o SQLServer e o PostgerSQL não se incomodam em olhar para a tabela:

    CREATE TABLE r (b INT);
    insert into r(b) values (1);
    insert into r(b) values (2);
    SELECT 1 FROM r HAVING 1=1;
    

    também retorna apenas uma linha. Mesmo que os documentos do SQLServer digam

    Quando GROUP BY não é usado, HAVING se comporta como uma cláusula WHERE.

    isso não é verdade neste caso - WHERE 1=1em vez de HAVINGretornar o número adequado de linhas. Eu diria que é um bug do otimizador (ou pelo menos um bug da documentação) ... O plano SQLServer mostra 'Verificação constante' no caso de HAVINGe 'varredura de tabela' para WHERE...

    O comportamento do Oracle e do Mysql parece mais lógico e correto para mim ...

    • 3

relate perguntas

  • Qual é a diferença entre select count(*) e select count(any_non_null_column)?

  • MAX para cada subconjunto

  • Como faço para particionar horizontalmente uma tabela de banco de dados oracle e devo?

  • Qual a diferença entre os dialetos SQL (DML-) dos principais fornecedores de banco de dados?

  • Calculando a porcentagem de uma linha sobre a soma total

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Conceder acesso a todas as tabelas para um usuário

    • 5 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve