Página 2 de 2

dúvida em select: resultado zero

Enviado: 30 Mai 2021 00:48
por cjp
Testei agora no localhost, com o MariaDB, e funcionou perfeitamente.
Então, o problema deve ser mesmo a versão do MySQL do provedor.
Vou providenciar a substituição.

dúvida em select: resultado zero

Enviado: 30 Mai 2021 12:48
por JoséQuintas
Só voltando um pouco

Código: Selecionar todos

select * from 
(select adddate('1970-01-01',t4*10000 + t3*1000 + t2*100 + t1*10 + t0) gen_date from
 (select 0 t0 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t0,
 (select 0 t1 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t1,
 (select 0 t2 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t2,
 (select 0 t3 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t3,
 (select 0 t4 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t4) v
where gen_date between '2017-01-01' and '2017-12-31'
Isso é até exagerado, mas muito interessante.
são 5 tabelas de 0 a 9.
Está sendo feito o JOIN, o que vai gerar a combinação de 99999 registros.
A fórmula é o que vai transformar isso em números de 0 a 99999, e somar à data de 1/1/1970, gerando uma sequência de 9.999 datas.

Traduzindo em Harbour:

Código: Selecionar todos

   FOR nDigito1 = 0 TO 9
      FOR nDigito2 = 0 TO 9
         FOR nDigito3 = 0 TO 9
            FOR nDigito4 = 0 TO 9
               FOR nDigito5 = 0 TO 9
                  ? Stod( "19700101" ) + ;
                     ( nDigito1 * 10000 ) + ;
                     ( nDigito2 * 1000 ) + ;
                     ( nDigito3 * 100 ) + ;
                     ( nDigito4 * 10 ) + ;
                     nDigito5
               NEXT
            NEXT
         NEXT
      NEXT
   NEXT
Pois é... acabou fazendo FOR/NEXT do "jeito tabela".
Fez operação com tabelas, que resultaram numa tabela com 9.999 datas, e selecionou as datas que interessavam.

NÃO SEI se compensaria fazer cada tabela de 1 em 1, 10 em 10, 100 em 100, e transformar a fórmula em apenas soma.
Se fizer diferença, talvez milésimos de segundo.

Mas é muito interessante.
É o que já conhecemos, mas fazendo com o recurso que está disponível no SQL, que é operação com tabelas.

E nem dá pra dizer que é coisa nova: aprendemos na escola sobre operações assim, só não lembro qual era o nome, lembro vagamente sobre união, intersecção, e coisas do tipo.

dúvida em select: resultado zero

Enviado: 30 Mai 2021 13:56
por JoséQuintas
Isso é interessante pra outra coisa também:

Uma operação com 5 tabelas de 10 registros gerou 99999 registros.
Se não tomar cuidado, é isso que pode acontecer com nossas pesquisas.
Mesmo que o resultado final seja trazer pouca informação pro terminal, o processo no servidor poderia fazer isso durante o processamento.

O processo acima parece gerar 99.999 registros com muitos inúteis, mas é rápido.
Acho que é porque a parte inútil já vai sendo descartada pelo WHERE, e acaba nem fazendo parte da tabela.

Pois é... só resta ir acostumando com essa "nova" forma de processar as coisas, e analisar cada caso.
E lembrando: pode ser diferente de uma base de dados SQL pra outra, cada um vai acabar tendo que fazer seus próprios testes.

Nota:
Pra mim isso tudo também é novidade.
Só estou tentando enxergar/entender o que está na frente do meu nariz, comparando com alguma coisa conhecida.

dúvida em select: resultado zero

Enviado: 30 Mai 2021 14:02
por JoséQuintas
tempo.png
Um décimo de segundo pra operação com 100.000 datas.

O comando é doido?
Com essa velocidade.. nem importa que seja doido... kkk

dúvida em select: resultado zero

Enviado: 30 Mai 2021 14:44
por JoséQuintas
E aproveitando... um CTEzinho... mas a outra opção usando recursivo parece melhor.

Código: Selecionar todos

WITH a as ( select 0 as x union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9 )

SELECT * FROM 
( select adddate('1970-01-01',a.x*10000 + b.x*1000 + c.x*100 + d.x*10 + e.x) as gen_date 
FROM
a, a AS b, a AS C, a AS d, a AS e
) AS x
where gen_date between '2017-01-01' and '2017-12-31'
Aqui é apenas pra mostrar o CTE criando a tabela a, que acabou sendo usada 5 vezes depois.

dúvida em select: resultado zero

Enviado: 30 Mai 2021 15:35
por JoséQuintas
JoséQuintas escreveu:mas a outra opção usando recursivo parece melhor.
Recursivo é muuuito melhor, porque acaba trabalhando só com o intervalo de datas que interessa, ao invés de 100.000 datas.
Não que 1 décimo de segundo seja problema, mas... nunca se sabe o que vém pela frente.

dúvida em select: resultado zero

Enviado: 31 Mai 2021 01:09
por alxsts
Olá!
JoséQuintas escreveu:aprendemos na escola sobre operações assim, só não lembro qual era o nome, lembro vagamente sobre união, intersecção, e coisas do tipo
Foi com base na Teoria dos conjuntos e na Álgebra relacional que o britânico Edgar Frank Codd criou a Linguagem SQL, no início dos anos 70, nos laboratórios da IBM em San Jose, Califórnia, EUA.