Verdade verdadeiríssima, Miltão...
 
 Gerson, quando eu dava treinamentos de SQL eu sempre usava como técnica 
didática a esquematização dos comandos, ie, tentava "quebrar" em diversas 
sub-partes lógicas, sempre achei que é interessante para aprendizado, E 
colocando em linhas separadas cada sub-parte, cada seção.... No caso de um 
JOIN, o esqueletão seria :
 
 SELECT colunasqueeuqueroexibirvindasdetodasastabelas
   FROM listadastabelasaseremjuntadas
   condiçõesdechaveentreastabelas
   
 vamos pensar nas duas primeiras linhas/seções que são mais fáceis de entender 
- recheando de carne o esqueleto/substiuindo pelo seu exemplo, chegaríamos em : 
   
 
SELECT cd_paciente, nm_paciente, ds_endereco, cd_etnia, nm_etnia
  FROM paciente, etnia
  
==> OU SEJA, eu olhei a tua lista de colunas de cada tabela e as copiei/colei 
no esqueleto, separadas por vírgulas, sim ?? NADA mais que isso... 

 Continuando, nem sempre é obrigatório mas é uma Excelente prática vc INDICAR 
no comando de qual tabela vem cada coluna, e a sintaxe para isso é separar o 
nome da tabela da respectiva coluna por um ponto, tipo :
 
SELECT paciente.cd_paciente, paciente.nm_paciente, paciente.ds_endereco, 
etnia.cd_etnia, etnia.nm_etnia
  FROM paciente, etnia
   
 => legal ?? Porém, apesar de funcionar/ser aceita, essa opção de vc colocar o 
nome completo da tabela na frente de cada coluna faz vc digitar DEMAIS, é 
trabalhosa.... Então a outra opção aceita e muito mais usada é vc dar um 
APELIDO para cada tabela na linha do FROM, e colocar na frente de cada coluna o 
APELIDO correspondente - vamos dar os apelidos de A e de B para cada tabela ?? 
Aí ficaria assim :

SELECT A.cd_paciente, A.nm_paciente, A.ds_endereco, B.cd_etnia, B.nm_etnia
  FROM paciente A, etnia B

  
=> até aqui, tranquilo  ?? Tá vendo como o comando está se formando ??? 
Acompanhou até aqui ??

 Para finalizar, vamos colocar a linha/seção que indica a CONDIÇÃO em que os 
dados devem ser juntados/lidos em cada tabela : a idéia é, vc NÂO QUER que para 
cada linha de cada paciente apareçam TODAS as etnias, vc quer APENAS a 
descrição da etnia correntemente sendo lida para o paciente atual , e (imagino, 
pelo jeitão das suas tabelas) que a informação, a Identificação da etnia 
corrente está na coluna CD_ETNIA, então é ESSA a chave, a condição a ser 
observada : indicando isso, o executor de SQLs do banco de dados já sabe que 
quando vc estiver lendo um paciente com, digamos, CD_ETNIA=1, é a descrição da 
etnia 1, aquela aonde CD_ETNIA é igual a 1 na tabela de etnia que virá... 
Depois, continuando a execução do comando SQL, quando o banco de dados vc ler 
um paciente com CD_ETNIA=2, é a descrição da tabela etnia aonde CD_ETNIA=2 que 
será trazida.... OU SEJA, o que vc quer é trazer da tabela etnia a descrição da 
etnia que seja IGUAL, que tenha o mesmo código, que a etnia do paciente sendo 
lido, sim ????
  Há duas maneiras de vc indicar isso, uma é indicar com uma cláusula WHERE o 
que que tem que ser igual nas duas tabelas para a ligação entre elas :
  
SELECT A.cd_paciente, A.nm_paciente, A.ds_endereco, B.cd_etnia, B.nm_etnia
  FROM paciente A, etnia B
 WHERE A.cd_etnia = B.cd_etnia;


==>> PRONTO !!! Executa isso e vc vai ter a sua resposta, sim ?? Muito difícil, 
ou deu pra acompanhar ??? 

 Esta forma que eu mostrei acima, aonde vc só indica o que que tem que ser 
igual nas duas tabelas, é a forma originalmente usada no dialeto SQL do banco 
de dados  Oracle.... 
  Há uma segunda forma, que é vc indicar a operação de join além de indicar a 
coluna-chave, ficaria tipo :
  
SELECT A.cd_paciente, A.nm_paciente, A.ds_endereco, B.cd_etnia, B.nm_etnia
  FROM paciente A join etnia B
    ON (A.cd_etnia = B.cd_etnia);
  
 ==> legal ??? Eu gosto mais da (e uso mais a) primeira forma , mas ambas 
funcionam, use aquela que gostar mais.... Espero que vc tenha captado a 
essência da coisa, e qquer dúvida, não hesite em nos mandar um copy/paste 
COMPLETO do que vc está tentando e das msgs que recebeu, BEM COMO uma descrição 
e uma explicação do que queria, que a gente discute em cima ...

 []s

   Chiappa

OBS IMPORTANTE : que fique Claro, o que mostrei acima é o caso mais simples de 
JOIN, em que sempre há uma linha de dados na tabela B para cada linha 
correspondente na tabela A, o chamado EQUI-JOIN - claro que há casos aonde isso 
não é verdadeiro, aí vc tem que usar OUTROS tipos de joins... Dá um look em 
http://dwhlaureate.blogspot.com.br/2012/08/joins-in-oracle.html , por exemplo, 
para um overview dos diversos tipos de joins....

--- Em oracle_br@yahoogrupos.com.br, "Milton Bastos Henriquis Jr." 
<miltonbastos@...> escreveu
>
> Sem problema Gerson, estamos aqui pra ajudar....
> 
> Nesse caso vc precisa COPIAR e COLAR tudo que vc está fazendo.
> Se nao deu certo, cole aqui pra gente o comando que vc usou e o erro que vc
> recebeu, senão fica difícil a gente adivinhar!
> 
> 
> 
> 
> 2013/7/12 gersonlima276 <gersonlim@...>
> 
> > **
> >
> >
> >
> > Ola Milton,
> > eu li, mas quando faço aqui não da certo e eu não entendo direito a
> > estrura desta query, desculpa ficar perguntando algo tão simples para
> > vocês, mas não sei aonde estou errando.
> >
> >
> > --- Em oracle_br@yahoogrupos.com.br, "Milton Bastos Henriquis Jr."
> > <miltonbastos@> escreveu
> > >
> > > Gerson, vc já tinha perguntado isso em outro e-mail e nós já tínhamos
> > > respondido, com o código prontinho pra vc...
> > > Vc chegou a ler?
> > >
> > >
> > >
> > > 2013/7/12 gersonlima276 <gersonlim@>
> > >
> > > > **
> >
> > > >
> > > >
> > > > Bom dia a todos,
> > > >
> > > > eu estou lendo algumas apostila para aprender sql e junto fazendo
> > alguns
> > > > exercício para entender melhor, mas ainda não entendi sobre inner
> > join, eu
> > > > dei um select aqui na empresa em duas tabela e esta assim:
> > > >
> > > > select * from paciente
> > > >
> > > > cd_paciente (21213)
> > > > nm_paciente (Amaral Rodrigues)
> > > > ds_endereço (Rua Jacu Pessego)
> > > > cd_etnia (2)
> > > >
> > > > select * from etnia
> > > >
> > > > cd_etnia (2)
> > > > nm_etnia (AMANAYE)
> > > >
> > > > eu estou fazendo um select para trazer a descrição da etnia(AMANAYE)
> > > >
> > > > perdoe a minha ignorância mas alguém pode me explicar com faço?
> > > >
> > > > Um grande abraço a todos vocês.
> > > >
> > > >
> > > > --- Em oracle_br@yahoogrupos.com.br, Fabio Prado <fbifabio@> escreveu
> >
> > > > >
> > > > > Gerson,
> > > > >
> > > > > (e) e (p) são apelidos das tabelas
> > > > >
> > > > > é uma boa prática atribuir apelidos curtos para as tabelas e
> > referenciar
> > > > os
> > > > > nomes das colunas com o apelido na frente
> > > > >
> > > > > O exemplo que vc passou está incompleto. O correto seria como está
> > > > escrito
> > > > > abaixo:
> > > > >
> > > > > select e.name. p.valor as pagamento
> > > > > from empregados as e
> > > > > left join pagamentos p
> > > > > ...
> > > > >
> > > > > Aconselho vc a fazer um curso de SQL básico. Veja o do link abaixo
> > (não
> > > > sei
> > > > > se é bom, mas é gratuito):
> > > > >
> > > > >
> > > >
> > http://www.softblue.com.br/site/curso/id/3/CURSO+SQL+COMPLETO+BASICO+AO+AVANCADO+ON+LINE+BD03
> > > > >
> > > > > []s
> > > > >
> > > > > Fábio Prado
> > > > > www.fabioprado.net
> > > > >
> > > > >
> > > > >
> > > > >
> > > > > 2013/7/11 gersonlima276 <gersonlim@>
> > > >
> > > > >
> > > > > > **
> > > > > >
> > > > > >
> > > > > > Ola mestre do Oracle,
> > > > > >
> > > > > > tira uma dúvida, no select abaixo eu preciso saber sobre o
> > significa a
> > > > > > letra (e)(p) na frente do name e do valor, como entender isto?
> > > > > >
> > > > > > select e.name. p.valor as pagamento
> > > > > > from empregados as left join pagamentos
> > > > > >
> > > > > > obrigado senhores!!!
> > > > > >
> > > > > >
> > > > > >
> > > > >
> > > > >
> > > > >
> > > > > --
> > > > > Fábio Prado
> > > > > www.fabioprado.net
> > > > > "Compartilhando conhecimentos e treinando profissionais em Bancos de
> > > > Dados
> > > > > Oracle"
> > > > >
> > > > >
> > > > > [As partes desta mensagem que não continham texto foram removidas]
> > > > >
> > > >
> > > >
> > > >
> > >
> > >
> > > [As partes desta mensagem que não continham texto foram removidas]
> > >
> >
> >  
> >
> 
> 
> [As partes desta mensagem que não continham texto foram removidas]
>


Responder a