GARANTIR DESCONTO

Fórum Left join, Inner join e Outer Join #45721

29/07/2004

0

Onde eu encontraria um Artigo para me explicar melhos o uso destes comandos, pois sempre tenho usado para relacionar tabelas diretamente atraves dos campos iguais.
Tipo assim

Select p.codigo, p.nome, v.custo, v.venda from
produtos p, valores v where p.codigo = v.codigo
order by p.codigo

Emery


:arrow: [color=red:14c8dbda8c]Título alterado pelo Moderador oTTo. [/color:14c8dbda8c]
:idea: [color=blue:14c8dbda8c]Seja mais claro no título.[/color:14c8dbda8c]
:idea: [color=blue:14c8dbda8c][url=http://forum.clubedelphi.net/viewtopic.php?t=16976]Saiba como obter resposta rápida..[/url][/color:14c8dbda8c]
:idea: [color=blue:14c8dbda8c]Leia sempre [url=http://forum.clubedelphi.net/viewtopic.php?t=6689]Regras de Conduta.[/url][/color:14c8dbda8c]
:idea: [color=blue:14c8dbda8c]Use sempre o Link [url=http://forum.clubedelphi.net/search.php][img:14c8dbda8c]http://forum.clubedelphi.net/templates/subSilver/images/icon_mini_search.gif[/img:14c8dbda8c] Pesquisar[/url] no topo da Página.[/color:14c8dbda8c]
:idea: [color=blue:14c8dbda8c]Evite usar caixa alta nos títulos.[/color:14c8dbda8c]


Emery

Emery

Responder

Posts

31/07/2004

Afarias

A sintaxe q vc utiliza é a forma antiga de se declarar INNER JOINs... a nova sintaxe é mais clara e fácil para os otimizadores.

vc tem 2 tipos de joins, os INNER e os OUTER

nos INNER joins (o mais comum), para um registro ser retornado ele deve ter sua correspondência em ambas tabelas

os OUTER joins são mais flexíveis e servem aos casos onde queremos todos os registros mesmo sem correspondência em uma ou ambas as tabelas envolvidas.

os OUTER joins podem ser de 3 tipos:: LEFT, RIGHT e FULL

o LEFT garante todos os registros da tabela a ´esquerda´ (1ª citada) mesmo sem correspondente na da ´direita´, o o RIGHT faz o contrário. Já o FULL traz todos os registros de ambas as tabelas mesmo não tendo suas correspondências.

ex: supondo que tenhamos as duas tabelas abaixo::

      T1              T2
============    ============
COD   NOME      COD   VALOR 
============    ============
1     AAA        1     10,0
2     BBB        5     50,0 
============    ============


observe os segintes SELECTS e seus resultados::

SELECT T1.COD, T1.NOME, T2.VALOR
FROM T1 INNER JOIN T2 ON (T1.COD=T2.COD)

Resultado:
=========================
COD       NOME      VALOR
=========================
1         AAA       10,0
=========================



SELECT T1.COD, T1.NOME, T2.VALOR
FROM T1 LEFT JOIN T2 ON (T1.COD=T2.COD)

Resultado:
=========================
COD       NOME      VALOR
=========================
1         AAA       10,0
2         BBB       NULL
=========================



SELECT T1.COD, T1.NOME, T2.VALOR
FROM T1 RIGHT JOIN T2 ON (T1.COD=T2.COD)

Resultado:
=========================
COD       NOME      VALOR
=========================
1         AAA       10,0
NULL      NULL      50,0
=========================



SELECT T1.COD, T1.NOME, T2.VALOR
FROM T1 FULL JOIN T2 ON (T1.COD=T2.COD)

Resultado:
=========================
COD       NOME      VALOR
=========================
1         AAA       10,0
2         BBB       NULL
NULL      NULL      50,0
=========================



Note que vc pode usar a sintaxe LEFT JOIN ou LEFT OUTER JOIN que dá no mesmo (isso vale para todos os OUTER joins)


T+


Responder

Gostei + 0

05/08/2005

@line

Oi,

Eu tenho uma duvida pessoal: eu posso tracar um relacionamento entre 5 tabelas, as tres primeiras com join e as duas ultimas com left join. E possivel fazer este tipo de operacao mista?


Obrigada,
Aline.


Responder

Gostei + 0

05/08/2005

Afarias

|E possivel fazer este tipo de operacao mista?

é possível.



T+


Responder

Gostei + 0

05/08/2005

@line

Ola,


Ha mais outra duvida: Como transformar esta consulta em outra usando join/left join/right join?

select x
from tabA
where x not in
(select x
from tabB
where letra = ´D´)
and x not in
(select x
from tabB
where letra is null)

Esta e so uma parte da consulta ela e bem mais complexa, mas acho que e neste ponto que esta o problema.

Fiz da seguinte forma:
select x
from tabA A left join tabB B on
(a.x = b.x)
where (letra <> ´D´ or letra is not null)


Grata e ate ja,
Aline


Responder

Gostei + 0

05/08/2005

Afarias

simplificando...

select x from tabA
where x not in (select x
from tabB
where letra is null or letra = ´D´)

ou

select x from tabA
where not exists (select 1
from tabB
where where x=tabA.x and letra is null or letra = ´D´)


quanto aos joins, seria bom de entender a natureza da relação e das tabelas para tentar dar uma sugestão...


T+


Responder

Gostei + 0

09/08/2005

@line

Oi Farias,


Fiz como vc indicou na 1ª resolução. Mas a respeito dos JOINS minha dúvida é o seguinte:

select X
from tabA A left join TabB B on
(A.x = B.x)


é nencessário que todas as linhas de A sejam exibidas, mesmo que não exista correspondência em B. O problema que eu tenho que especificar a cláusula WHERE e uma das condições é ´letra is null´. Isso não faz com que sejam exibas somente as linhas que tenham em A, mas não tenhão em B?


Obrigada,
Aline.


Responder

Gostei + 0

09/08/2005

Afarias

select X from tabA A
left join TabB B on (A.x = B.x)

|Isso não faz com que sejam exibas somente as linhas que tenham em A,
|mas não tenhão em B?

Bom, que não tenham em B com Letra diferente de NULL.

O Where ele vai atuar sobre o JOIN, ou seja: depois q o conjunto está formado. Mas, vc pode ´filtar´ as tabelas antes de realizar o JOIN, talves o q vc deseja é:

select A.x from TabA A
left join TabB B on (B.x=A.x and B.letra is null);


Colocando a condição no JOIN é diferente de colocá-la no WHERE, neste caso a condição atua no conjunto ´ANTES do JOIN´.


T+


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar