dúvida em select: resultado zero

Forum sobre SQL.

Moderador: Moderadores

cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

dúvida em select: resultado zero

Mensagem 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.
Inacio de Carvalho Neto
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

dúvida em select: resultado zero

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

dúvida em select: resultado zero

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

dúvida em select: resultado zero

Mensagem 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
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

dúvida em select: resultado zero

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

dúvida em select: resultado zero

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

dúvida em select: resultado zero

Mensagem 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.
[]´s
Alexandre Santos (AlxSts)
Responder