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 / user-27070

Raymond Nijland's questions

Martin Hope
Raymond Nijland
Asked: 2019-03-10 10:52:57 +0800 CST

Uso ORDER BY na subconsulta (tabela derivada) Padrão SQL permitido ou não

  • 1

A documentação do MariaDB está mencionando que a ORDER BYcláusula nas subconsultas (tabela derivada) nunca é permitida pelos padrões SQL.

Significando a consulta SQL

SELECT
   field1
 , field2
FROM (
  SELECT
       field1
     , field2
  FROM
   table1
  ORDER BY field2
) alias

nunca é permitido pelos padrões SQL

Uma "tabela" (e subconsulta na cláusula FROM também) é - de acordo com o padrão SQL - um conjunto não ordenado de linhas. As linhas em uma tabela (ou em uma subconsulta na cláusula FROM) não vêm em nenhuma ordem específica. É por isso que o otimizador pode ignorar a cláusula ORDER BY que você especificou. Na verdade, o padrão SQL nem permite que a cláusula ORDER BY apareça nesta subconsulta

ver fonte

Mas quando eu olho para o padrão SQL 92. (eu sei que é antigo)

4.9 Tabelas

...
...
Uma tabela é uma tabela base, uma tabela visualizada ou uma tabela derivada. Uma tabela base é uma tabela base persistente, uma tabela temporária global, uma tabela temporária local criada ou uma tabela temporária local declarada.
...
...
Uma tabela derivada é uma tabela derivada direta ou indiretamente de uma ou mais outras tabelas pela avaliação de um arquivo <query expression>. Os valores de uma tabela derivada são derivados dos valores das tabelas subjacentes quando o <query expression>é avaliado.
...
...

As tabelas simplesmente subjacentes de tabelas derivadas e cursores são definidas na Subcláusula 7.9, "<query specification>", Subcláusula 7.10, "<query expression>", e Subcláusula 13.1, "<declare cursor>". Uma tabela visualizada não possui tabelas simplesmente subjacentes.

Eles mencionam cursores para ver o que eles dizem sobre cursores e o que são.

4.21 Cursores

...
...

Um cursor no estado aberto identifica uma tabela , uma ordenação das linhas dessa tabela e uma posição relativa a essa ordenação. Se o <declare cursor>não incluir um <order by clause>, ou incluir um <order by clause>que não especifica a ordem das linhas completamente, então as linhas da tabela terão uma ordem que é definida apenas na medida em que <order by clause>especifica uma ordem e depende da implementação.

Então eles mencionam aqui que um cursor em estado aberto pode ser uma tabela ou uma tabela base, uma tabela visualizada ou uma tabela derivada. se você observar como eles definem o que é uma tabela na seção 4.9 Tabelas

Se eu ler isso, poderia estar interpretando-o como usando ORDER BYuma tabela derivada (como a consulta SQL acima) é perfeitamente válido pelos padrões SQL e cabe aos fornecedores se eles permitirem ORDER BYcomo opção.
Mas eu estaria interpretando errado inglês não é minha mãe laungauge, então a questão é estou interpretando corretamente?

sql-standard
  • 1 respostas
  • 1919 Views
Martin Hope
Raymond Nijland
Asked: 2017-10-08 07:46:07 +0800 CST

Simular LEAD(1) ​​ou LEAD(2) efetivo no MySQL

  • 4

Suponha que eu tenha uma mesa com o alfabeto holandês ou inglês.

Alfabeto

digit   
--------
a       
b       
c       
d       
e       
f       
g       
h       
i       
j       
k       
l       
m       
n       
o       
p       
q       
r       
s       
t       
x       
y       
z       

Agora eu quero exibir uma lista como esta.

digit   next_digit  next_two_digit  
------  ----------  ----------------
a       b           c               
b       c           d               
c       d           e               
d       e           f               
e       f           g               
f       g           h               
g       h           i               
h       i           j               
i       j           k               
j       k           l               
k       l           m               
l       m           n               
m       n           o               
n       o           p               
o       p           q               
p       q           r               
q       r           s               
r       s           t               
s       t           x               
t       x           y               
x       y           z               
y       z           (NULL)          
z       (NULL)      (NULL)    

No Oracle (e mais bancos de dados que suportam funções de janela) você pode obter esta lista com

SELECT 
   "digit"
 , LEAD("digit", 1) OVER (ORDER BY "digit" ASC) as next_digit   
 , LEAD("digit", 2) OVER (ORDER BY "digit" ASC) as next_two_digits
FROM 
 alfabet
ORDER BY 
 "digit" asc

demonstração http://www.sqlfiddle.com/#!4/a11f1/4

Agora eu quero simular a função de janela lead(1) e lead(2) no MySQL.

Agora no MySQL eu sei que posso obter o mesmo com subconsultas co-relacionadas assim.

SELECT 
 *
 , (SELECT 
     *
    FROM 
     alfabet alfabetInner 
    WHERE
      alfabetInner.digit > alfabet.digit     
    ORDER BY 
      digit ASC
    LIMIT 0, 1      
   ) AS next_digit

 , (SELECT 
     *
    FROM 
     alfabet alfabetInner 
    WHERE
      alfabetInner.digit > alfabet.digit     
    ORDER BY 
      digit ASC
    LIMIT 1, 1      
   ) AS next_two_digit   
FROM 
 alfabet  
ORDER BY
 alfabet.digit ASC 

Editado por causa do comentário de Evan Carroll

por que a tabela Alfabet não armazena apenas o número de identificação/linha nela?

Porque eu queria simular uma solução LEAD(1) ​​ou LEAD(2) pura sem precisar de uma sequência de incremento automático sem lacunas como ID PRIMARY ... a função de janela do Oracle não faz nada com uma chave PRIMARY de incremento automático também.

demonstração http://www.sqlfiddle.com/#!9/6a8701/2

Agora a pergunta. Você conhece ainda mais métodos de simulação LEAD (eficazes)?

mysql
  • 1 respostas
  • 8083 Views

Sidebar

Stats

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

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 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

    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
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • 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
    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