Mostrando postagens com marcador sql. Mostrar todas as postagens
Mostrando postagens com marcador sql. Mostrar todas as postagens

sábado, 13 de novembro de 2010

Subconsultas em SQL

Olá denovo...
Depois de um tempo fora, to voltando agora com uma dica importante em sql...

Durante o processo de desenvolvimento de um site me deparei com a seguinte situação: eu precisava retornar os 5 maiores valores de uma coluna e ordená-los por outra coluna diferente, rapidamente pensei em usar o comando IN, ficaria assim:

SELECT `coluna_chave`,`coluna_1`,`coluna_2` FROM `tabela` WHERE `coluna_chave` IN (SELECT `coluna_chave`,`coluna_2` FROM `tabela` ORDER BY `coluna_2` DESC LIMIT 0,5) ORDER BY `coluna_1`;

Ou seja, na consulta dentro do comando "IN" ele faria uma busca na tabela ordenando pela coluna 2 e tendo como limit 5, ou seja, seriam mostrados os cinco maiores valores da coluna 2.
O SELECT principal retornaria as linhas cuja a `coluna_chave` encontravam-se na consulta dentro do "IN" (os 5 maiores valores) e depois ordenaria pela coluna 2.

Esse comando resolveria meu problema, porém o MYSQL não suporta o comando LIMIT dentro de um comando IN.

E passaram-se mais alguns minutos pensando até que cheguei num outro comando:

SELECT `coluna_chave`,`coluna_1`,`coluna_2` FROM (SELECT `coluna_chave`,`coluna_1`,`coluna_2` FROM `tabela` ORDER BY `coluna_2` DESC LIMIT 0,5) as `tabela_2` ORDER BY `coluna_1`;

Ou seja, resolvi colocar a subconsulta no lugar tabela. Sendo assim ele busca os resultados de uma tabela gerada por uma subconsulta (subconsulta essa que retorna somento os 5 maiores valores da coluna_2) e não pela tabela completa e podendo depois disso ordenar por uma outra coluna, neste caso pela coluna_2.

Ufa... finalmente problema resolvido. Comente aqui se você enfrentou algum problema semelhante e se isso ocorrem em outros bancos.

Espero ter ajudado, nos vemos outro dia.
Abraço

sexta-feira, 15 de outubro de 2010

Comando alternativo ao MINUS

Ontem enfrentei um problema que talvez muitos iniciantes em linguagem SQL podem enfrentar....
Precisava de uma consulta que retornassem algumas colunas e que a chave primária da tabela não estivesse em uma tabela resultada de um SELECT...

Por exemplo:

Tabela clientes: `cliente_codigo`
Tabela produtos: `produto_codigo`
Tabela compras: `produto_codigo`,`cliente_codigo`

Sendo que a tabela `compras` mostra quem comprou algum produto...

O comando em questão seria caso fosse necessário achar aqueles clientes que ainda não efetuaram compras, ou seja, retornar todos os registros da tabela clientes que não estão presentes na tabela compras.
Usando o comando MINUS ficaria assim:

SELECT 'clientes'.'cliente_codigo'
FROM 'clientes'
MINUS
SELECT 'compras'.'cliente_codigo'
FROM 'compras';


Porém somento os clientes do Banco de Dados Oracle que tem essa exclusividades. Para aqueles (que como eu) que usam outro Banco de Dados será necessário usar o comando NOT IN:

SELECT 'clientes'.'cliente_codigo'
FROM 'clientes'
WHERE 'clientes'.'cliente_codigo' NOT IN
(
SELECT 'compras'.'cliente_codigo'
FROM 'compras'
);


Então para aqueles que encontrarem o comando MINUS em publicações, artigos, tutoriais e etc., fica o aviso que este comando é exclusivo do Oracle que uma alternativa é usar o comando NOT IN. Vale ressaltar ainda que há situações em que o NOT IN não consegue substituir o comando MINUS, mas isso já é assunto pra outra hora...

Vale ressaltar que a solução quem me trouxe foi o Prof. Fernando Prass....

Espero ter ajudado...
Abraço