Fórum Left join, Inner join e Outer Join #45721
29/07/2004
0
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
Curtir tópico
+ 0Posts
31/07/2004
Afarias
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+
Gostei + 0
05/08/2005
@line
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.
Gostei + 0
05/08/2005
Afarias
é possível.
T+
Gostei + 0
05/08/2005
@line
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
Gostei + 0
05/08/2005
Afarias
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+
Gostei + 0
09/08/2005
@line
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.
Gostei + 0
09/08/2005
Afarias
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+
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)