Clipper On Line • Ver Tópico - dúvida em select: resultado zero

dúvida em select: resultado zero

Discussão sobre SQL

Moderador: Moderadores

 

dúvida em select: resultado zero

Mensagempor cjp » 30 Mai 2021 00:48

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
cjp
Usuário Nível 6

Usuário Nível 6
 
Mensagens: 1527
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 10 vezes
Mens.Curtidas: 20 vezes

dúvida em select: resultado zero

Mensagempor JoséQuintas » 30 Mai 2021 12:48

Só voltando um pouco

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:
   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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

dúvida em select: resultado zero

Mensagempor JoséQuintas » 30 Mai 2021 13:56

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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

dúvida em select: resultado zero

Mensagempor JoséQuintas » 30 Mai 2021 14:02

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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

dúvida em select: resultado zero

Mensagempor JoséQuintas » 30 Mai 2021 14:44

E aproveitando... um CTEzinho... mas a outra opção usando recursivo parece melhor.

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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

dúvida em select: resultado zero

Mensagempor JoséQuintas » 30 Mai 2021 15:35

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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

dúvida em select: resultado zero

Mensagempor alxsts » 31 Mai 2021 01:09

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)
alxsts
Colaborador

Colaborador
 
Mensagens: 2943
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

Anterior



Retornar para SQL

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 8 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro