Array
(
)

subconsultas: independentes e correlatas

Mariana Carvalho
   - 15 abr 2014

mais uma vez com uma pergunta, acredito que não é tão simples.
qual a finalidade da subconsulta? li algo sobre o mesmo e a resposta foi meio vago. e para que serve as subconsultas independentes e correlatas?(na pratica).

Alex Lekao
   - 15 abr 2014

Oi Mariana,

Eu uso bastante sub consultas, nao sei bem a respeito das empressoes de independentes e correlatas, mas vamos la. rsrsr

Por exemplo, no cadastro de clientes vc nao tem a data da ultima compra do seu cliente, vc pode obter esse dado a partir de uma subconsulta na tabela de vendas.

Com relacao a independencia ou correlatividade, honestamente eu nunca pensei a respeito e nem estudei desta forma.

Acredito que possa ser o seguinte.

No seu select principal, para apresentar um valor meramente informativo que nao tenha relacao nenhuma com esse select principal vc monta um outro select apenas para informar isso.

e em outro campo por exemplo vc no seu select relaciona campos desta tabela que esta na subconsulta com algum campo da tabela da consulta principal.

neste ultima citacao o exemplo que citei acima o subselect seria o correlato.

Espero que tenha ajudado.

Abraco.

Alex - Lekao

Mariana Carvalho
   - 15 abr 2014

vamos por partes, rsrsrs
eu tenho uma consulta que pega uns 3 campos de uma tabela, então eu crio uma subconsulta bem mais especifica, ex: quero pegar o ultimo ou penultimo campo. mas em nivel de banco de dados, é importante, ou isso é mais utilizado em aplicações?

Faabiianooc
   - 16 abr 2014

Eu considero subconsulta uma forma "errada" de se trabalhar, principalmente com a possibilidade de valores null, o mais correto é utilizar
JOINS(Left,inner,right,cross).
Mas a questão da subconsulta é filtar o resultado, exemplo quero apenas os resultado de uma tabela que tenha em uma tabela.

#Código

Select * from tabela1
where id in(select id from tabela2)


Ou que não tenha com a data igual.

#Código
Select * from tabela1 as fora
where id not in(select id from tabela2 as dentro
where fora.data <> dentro.data
)


Verifique sobre os operadores some, any e all, eles são utilizados para subconsultas.

E assim vai..
Assunto complexo.

Alex Lekao
   - 16 abr 2014

Oi Mariana,

Eh quase isso. rsrsr

Com relacao a Aplicacao, ela possivelmente(falo como quem nao desenvolve) fara uso do resultado obtivo a partir do script que vc montou no banco.

Um exemplo pratico que eu faco uso aqui.

no meu script eu agrupo todas as vendas por clientes, e faco referencia de representatividade por cliente.

Para que se tenha um parametro para essa respresentatividade eu preciso saber, e informar, quanto a empresa vendeu no seu total, com isso o meu script vai apresentar os valores dos clientes e em uma subconsulta, sem importar o cliente, no caso ela ficaria independente, onde eu somo todas as vendas da empresa, e para colocar a representacao do cliente, eu monto uma outra subconsulta so que lincando os codigos de clientes desta subconsulta a consulta principal, assim eu tenho uma subselect independente, e uma subselect correlata.

lembrando que eu imagino que os termos usados como independente e correlato seja desta forma, porque eu nao tenho habito nem estudei a respeito destes termos, entao estou supondo que essa situacao que informei seja isso que vc questionou.

nao sei se ajudei ou compliquei ainda mais. rsrsrs

Mariana Carvalho
   - 16 abr 2014

Fabiano, a subconsulta, no seu exemplo é: um select dentro de outro select não é? mais uma perguntinha, por que você considera errada? me desculpe a pergunta, é pq vi isso no livro, e pra mim ficou estranho a forma que escreveu. por favor, não interprete mal a minha pergunta.

#Código


Select * from tabela1 as fora
where id not in(select id from tabela2 as dentro
where fora.data <> dentro.data
)

Mariana Carvalho
   - 16 abr 2014

Alex, vc escreve demais, kkkkk, brincadeira, vc pode mostrar um codigo que exemplifique?

Faabiianooc
   - 16 abr 2014


Citação:
Fabiano, a subconsulta, no seu exemplo é: um select dentro de outro select não é? mais uma perguntinha, por que você considera errada? me desculpe a pergunta, é pq vi isso no livro, e pra mim ficou estranho a forma que escreveu. por favor, não interprete mal a minha pergunta.

#Código


Select * from tabela1 as fora
where id not in(select id from tabela2 as dentro
where fora.data <> dentro.data
)



Porque quando se tem valores nullos é desconsiderado, e pode ter problemas de inconsistencia

Alex Lekao
   - 16 abr 2014

kkkkk... sem problemas... eu tbm acho que escrevo demais as vezes. rsrsr

Entao seguindo o exemplo que tenho mencionado.

#Código

SELECT
  CLIENTE.CODIGO,
   CLIENTE.NOME,
   (SELECT
       SUM(VENDAS.TOTAL)
    FROM VENDAS) AS [TOTAL GERAL],
   (SELECT
       SUM(VENDAS.TOTAL)
    FROM VENDAS
    WHERE VENDAS.CODCLI = CLIENTE.CODIGO) AS [TOTAL CLIENTE]
FROM CLIENTE


Esse exemplo de codigo de estoque usando esta meio grosseiro e pode haver erro de estrutura sintaxe, etc, eh ficticio nao pequei nada meu que ja faca uso para exemplificar.

Voce tem o select principal(pelo menos eu trato assim... nao sei se esta errado ou nao.... rsrsrsr) e nas selecoes eu monto um outro select(subselect... tbm chamo assim... acredito que esteja certo... rsrsr), no caso da coluna que nomeei como total geral eu estou somando todas as vendas, tendo assim o valor total vendido pela empresa, no segundo subselect eu estou fazendo referencia do codigo de clientes constante na tabela vendas com o codigo de clientes da tabela clientes do select principal.

Nas minhas utilizacoes aqui, eh bem normal eu fazer uso deste recurso, porque sempre acontece de vc precisar de um dado que vc nao tem e com isso vc tem a necessidade de monta-lo de alguma forma e algumas delas eh buscar em outra tabela e relacionar com a tabela principal.

o meu exemplo pode nao ser o ideal, porque daria para usar juncao e tal, mas como o intuito era exemplificar os casos de selects, montei desta forma.

Espero ter ficado melhor agora. rsrsr

Pensei em tentar escrever menos... mas nao consegui. kkkk

Abraco.

Alex - Lekao

Citação:
Alex, vc escreve demais, kkkkk, brincadeira, vc pode mostrar um codigo que exemplifique?

Mariana Carvalho
   - 16 abr 2014

Fabiano, obrigada, entendi perfeitamente, deve-se utilizar somente em tabelas que não tenham valores nulos.

Alex, entendi a ideia do codigo, e o que vc explicou.

vejo a subconsulta da seguinte maneira, me corrijam caso tenha escrito alguma coisa sem sentido, a subconsulta pode ser substituida por um select bem construido. vi nesse topico, pros e contras e tambem enxerguei como um trabalho a mais.

Roniere Almeida
   - 16 abr 2014

perguntinha manjada, essas subconsultas, em outros SGBDs, são melhores?

Jefferson Santos
   - 16 abr 2014


Citação:
Fabiano, obrigada, entendi perfeitamente, deve-se utilizar somente em tabelas que não tenham valores nulos.

Alex, entendi a ideia do codigo, e o que vc explicou.

vejo a subconsulta da seguinte maneira, me corrijam caso tenha escrito alguma coisa sem sentido, a subconsulta pode ser substituida por um select bem construido. vi nesse topico, pros e contras e tambem enxerguei como um trabalho a mais.


Ao meu ver, não existindo o certo e o errado, e sim o coerente! veja. sendo simples voce pode fazer de qualquer uma das formas, levando em consideração que seu sistema SEMPRE manipulara a mesma quantidade de registros, isso devido a grande performance das máquinas e dos bancos de dados,

Utilizando a segunda opção com INNER JOIN, inicialmente pode ser mais custoso, pois o banco fará mais operações internas ( como Join e Group By ) já na SubQuery o banco fará 2 Selects. como disse embora mais custoso, quando for estiver manipulando uma grande quantidade de registros ficará evidente que utiliza-se de uma SubQuery não é a melhor opção.

Alex Lekao
   - 16 abr 2014

Eu particularmente sempre utilizo as juncoes, mas infelizmente tem resultados que so optenho com as subselects, com isso acaba sendo necessario.

Com relacao ao custo, eh interessante se aprofuncao com o plano de manutencao que ajuda muito nesses casos e ja indica alguns indices que podem ser criados para melhorar a performance.

de qqr forma tem que se avaliar tudo, dependendo do que estiver querendo pode valer a pena criar uma view com os dados grossos e em seguida tratar o resultado final na view, acho que pode ser melhor, mas em relacao a custos nao tenho certeza se sera melhor ou nao o uso da view.

ou uma tabela temporaria, existe varios recursos que podem subtistuir o que normalmente montamos como consultas e subconsultas. rsrsr

com relacao a essa utilizacao em outros bancos(como perguntou o Roniere) eu desconheco, mas acredito que cada banco trabalhe melhor algumas situacoes embora alguns defendam que seja igual os usos gerais. rsrsr

Espero ter ajudado.

Abraco.

Alex - Lekao

Mariana Carvalho
   - 16 abr 2014

fiz uma leitura sobre o assunto, mas acho que vou apenas estudar por cima, não vejo futuro, rsrsrsrs.

Jefferson Santos
   - 17 abr 2014


Citação:
fiz uma leitura sobre o assunto, mas acho que vou apenas estudar por cima, não vejo futuro, rsrsrsrs.


Esse é o futuro.
É utilizado quase em 60%, 70% do dia a dia.
Criação de view, procedure, trigger, relatorio, consulta.
Otimização do banco, uso de memoria, uso de CPU.

Marisiana
   - 17 abr 2014

Tava acompanhando o post, e eu concordo com o que o Jefferson acabou de mencionar!
A utilização de subconsultas é bem útil e muitas vezes simplifica a solução de um problema que parecia complexo.

Alex Lekao
   - 17 abr 2014

Ola Bom dia!!

Com Absoluta Certeza!!!

Ja estive montando consultas aqui com juncoes e tal e nao consegui o resultado esperado, so com uma subconsulta atingi o que eu queria.

Eh claro que nao podemos espalhar subconsultas a torto e direito, mas eh um mal necessario. rsrsr

Essas coisas fazem parte do dia a dia de quem trabalha com banco no que se refira a programacao a nivel de banco e administracao.

Mas eu sou suspeito para falar, apesar do pouco conhecimento e experiencia, sou apaixonado por fazer isso. rsrsr

Abraco.

Alex - Lekao

Marisiana
   - 17 abr 2014

Tudo se resume em boas práticas e em saber o que se está fazendo. =)

Alex Lekao
   - 17 abr 2014

verdade. rsrsr

Mariana Carvalho
   - 17 abr 2014


Citação:

Citação:
fiz uma leitura sobre o assunto, mas acho que vou apenas estudar por cima, não vejo futuro, rsrsrsrs.


Esse é o futuro.
É utilizado quase em 60%, 70% do dia a dia.
Criação de view, procedure, trigger, relatorio, consulta.
Otimização do banco, uso de memoria, uso de CPU.


e subconsulta, utiliza bastante?

Marisiana
   - 18 abr 2014

Utiliza-se bastante Mariana!
Tem muitos e muitos casos que só se consegue solucionar utilizando subconsulta.
Recomendo a leitura desse link pra você entender melhor: http://aserlorenzo.com/manSQL/Oracle/dml/subconsultas/SubConsultaSimplesECorrelacionada.htm