Query em tres tabelas

3 respostas
L

Boas pessoal,

Eis a BD:

tabela1 ( T1Campo1, T1Campo2, T1Campo3, T1Campo4, T1Campo5, T1Campo6, T1Campo7, T1Campo8, T1Campo9  )    // Tem relação com a tabela2 em ( tabela1.T1campo5 = tabela2.T2Campo5 )      

tabela2 ( T2Campo1, T2Campo2, T2Campo3, T2Campo4, T2Campo5  )    // Tem relação com a tabela1 em ( tabela1.T1campo5 = tabela2.T2Campo5 )           

tabela3 ( T3Campo1, T3Campo2, T3Campo3, T3Campo4, T3Campo5  )    // Tem relação com a tabela1 em ( tabela1.T1campo1 = tabela3.T2Campo1 ) and ( tabela1.T1campo2 = tabela3.T2Campo2 ) and ( tabela1.T1campo3 = tabela3.T2Campo3 ) and ( tabela1.T1campo4 = tabela3.T2Campo4 )

Tenho a seguinte query para apanhar os dados das tres tabelas :

select T1Campo1, T1Campo2, T1Campo3, T1Campo4, T1Campo5  from  tabela1 inner join tabela2 on (tabela1.T1campo5 = tabela2.T2Campo5) 
inner join tabela3 on (tabela1.T1campo1 = tabela3.T3Campo1) and (tabela1.T1campo2 = tabela3.T3Campo2) and 
(stabela1.T1campo3 = tabela3.T3Campo3) and (tabela1.T1campo4 = tabela3.T3Campo4) 
where T1Campo6 = ? and T1Campo7 = ? and T1Campo8 = ? and T1Campo9 >= ?

O problema é que nesta query quando não existe nenhum valor na tabela3 o resultSet nao mostra todos os resultados das outras tabelas( Mostra apenas os que têm algum registo na tabela3, e os que nao têm nao mostra), ou seja ou ResultSet so mostra quando existe registo na tabela3.

A questão é que as vezes ha valores para serem mostrados nas tabelas tabela1 e tabela2 que nao têm registo na tabela3.
Desta forma gostaria de saber se ha alguma forma de eu ignorar quando nao houvesse dados na tabela3.

3 Respostas

H

Pelo que vi voce está usando MS SQL SERVER não é?

Então, ao invés de usar inner join usa um left join.

Dá uma olhadinha no help !!!

L

Boas,

usei o left join, mas o que acontece é que ele me da um NullPointer Exception porque quando tenta apanhar o campo na tabela3 nao encontra nada.
eu tenho o meu while mais ou menos assim :

try{      
             while( rs.next())
                {

                   String data = new String(rs.getString(2));
                  String desc = new String(rs.getString(6).trim());
                  String desc1 = new String(rs.getString(3).trim());
                  String datav = new String(rs.getString(4));
                  String narrativa = new String(rs.getString(8));  //ELE DA O ERRO AQUI PORQUE NAO CONSEGUE CRIAR ESTA STRING E APANHAR ESTE DADO PORQUE NAO EXISTE.
               
                     .......

              }


 }catch(NullPointerException npe){
              npe.printStackTrace();
              System.out.println("Não apanhou a o dado na tabela3 ! ");
          }

E assim o meu while pára e nao consigo ver todos os dados !

e recebo o seguinte erro :
java.lang.NullPointerException
Não apanhou a o dado na tabela3 !

Preciso de arranjar uma forma de ele ignorar caso o ResultSet da tabela3 seja Null.

Obrigado desde ja !

H

Então na query, mais precisamente no campo da tabela 3 que você quer selecionar faça o seguinte tab2.campo1 = isnull(tab3.campo1, ‘x’)

Assim quando for nulo a função isnull retornará ‘x’.

Ok !!!

Criado 23 de janeiro de 2007
Ultima resposta 24 de jan. de 2007
Respostas 3
Participantes 2