Vou tentar te descrever o meu cenário para ver se pode me propor uma alternativa ao que eu estou fazendo/tentando fazer.
Esses dados que postei como exemplo são para um cadastro de um sistema.
Imagine um cadastro e que vc queira fazer uma inclusão.
Esse select em multiplas tabelas será feito para poder preencher os comboboxes do cadastro para que o usuário faça a
seleção da opção desejada.
Como o sistema tem acesso remoto (RMI), se eu fizer um select para cada tabela será invocada várias requisições
do cliente para o servidor que requisitará para a camada de persistência que requisitará para o BD.
Minha intensão é fazer apenas uma requisição, por isso pensei nesse select em várias tabelas.
As tabelas não tem relação umas com as outras porque realmente não se faz necessário. É só uma necessidade específica para
quando eu for carregar o form do cadastro para o usuário poder incluir/alterar o registro.
Vc tem razão quando diz que terei um volume de dados alto (cross-join)..
Tem como eu fazer o que preciso de alguma outra forma, ou seja, "pegar" tais regsitros de várias tabelas em apenas 1 select?
atenciosamente
Leonardo
On 10/5/06, Osvaldo Rosario Kussama <[EMAIL PROTECTED]
> wrote:
Leonardo Ribeiro escreveu:
> Pois é..
>
> As tabelas não tem relação umas com as outras...
> Eu faço esse select para não precisar ficar fazendo um select
> separado por vez e assim para cada select realizar uma requisição
> remota. (trabalho com sistema com acesso remoto)
>
> Precisa mesmo era pegar todos os registros das tabelas do select mas
> elas não tem relação umas com as outras....
>
> alguma idéia?
>
>
> On 10/5/06, * Thiago Risso* <[EMAIL PROTECTED]
> <mailto: [EMAIL PROTECTED]>> wrote:
>
> Utilize o LEFT JOIN ...
> Mas para isso deve haver alguma relação entre as tabelas...
> Supondo que na table tp_pessoa exista : id_status, id_entidade,
> id_registro_classe.
>
> Ficaria assim :
>
> SELECT p.cd_pessoa , tp.descricao, st.cd_status, st.descricao,
> te.cd_tp_entidade, te.descricao, trc.cd_tp_registro_classe FROM
> tp_pessoa
> LEFT JOIN status S ON S.id_status = tp.id_status
> LEFT JOIN tp_entidade te ON te.id_entidade = tp.id_entidade
> LEFT JOIN tp_registro_classe trc ON trc.id_registro_classe =
> tp.id_registro_classe;
>
> Dessa FORMA a uma obrigatoriedade é existir o registro na tabela
> tp_pessoa.
> caso não exista em qualquer das outras tabelas os campos referentes a
> ela veem NULL;
>
> Att:
>
> Thiago Risso
>
>
> On 10/5/06, Leonardo Ribeiro <[EMAIL PROTECTED]
> <mailto: [EMAIL PROTECTED]>> wrote:
> > Senhores,
> >
> > supondo a seguinte consulta:
> >
> > select tp.cd_pessoa , tp.descricao,
> > st.cd_status, st.descricao,
> > te.cd_tp_entidade, te.descricao,
> > trc.cd_tp_registro_classe
> > from tp_pessoa tp, status st, tp_entidade te, tp_registro_classe
> trc;
> >
> > Se por acaso alguma das tabelas estiver vazia, sem nenhum
> registro, esse
> > select
> > não retorna nada..
> > Há um meio de retornar pelo menos os dados das tabelas que
> possuem registro?
Em primeiro lugar aconselho que você reveja urgentemente sua aplicação,
pois se as tabelas "não tem relação umas com as outras" como você afirma
então você está fazendo um cross-join (isto é cada linha de uma tabela é
combinada com todas as linhas das demais tabelas) o que implica num
volume de dados repetidos sendo transmitidos extremamente alto (a não
ser cada tabela possua no máximo uma linha...).
bdteste=# SELECT * FROM ta;
id | descr
----+-------
1 | a
2 | b
3 | c
(3 registros)
bdteste=# SELECT * FROM tb;
id | descr
----+-------
55 | X
66 | Y
(2 registros)
bdteste=# SELECT * FROM ta, tb;
id | descr | id | descr
----+-------+----+-------
1 | a | 55 | X
1 | a | 66 | Y
2 | b | 55 | X
2 | b | 66 | Y
3 | c | 55 | X
3 | c | 66 | Y
(6 registros)
Como alternativa, se os campos de suas tabelas forem união-compatíveis,
você pode utilizar algo como:
SELECT 'Pessoa', cd_pessoa, descricao FROM tp_pessoa
UNION ALL
SELECT 'Status', cd_status, descricao FROM status
UNION ALL
SELECT 'Entidade', cd_tp_entidade, descricao FROM tp_entidade
UNION ALL
SELECT 'Classe', NULL, cd_tp_registro_classe FROM tp_registro_classe;
Veja:
http://www.postgresql.org/docs/8.1/interactive/queries-union.html
bdteste=# SELECT 'ta',* FROM ta UNION ALL SELECT 'tb',* FROM tb;
?column? | id | descr
----------+----+-------
ta | 1 | a
ta | 2 | b
ta | 3 | c
tb | 55 | X
tb | 66 | Y
(5 registros)
[]s
Osvaldo
_______________________________________________________
Você quer respostas para suas perguntas? Ou você sabe muito e quer compartilhar seu conhecimento? Experimente o Yahoo! Respostas !
http://br.answers.yahoo.com/
_______________________________________________
Grupo de Usuários do PostgreSQL no Brasil
Antes de perguntar consulte o manual
http://pgdocptbr.sourceforge.net/
Para editar suas opções ou sair da lista acesse a página da lista em:
http://pgfoundry.org/mailman/listinfo/brasil-usuarios
--
[]'s
Leonardo
_______________________________________________ Grupo de Usuários do PostgreSQL no Brasil Antes de perguntar consulte o manual http://pgdocptbr.sourceforge.net/
Para editar suas opções ou sair da lista acesse a página da lista em: http://pgfoundry.org/mailman/listinfo/brasil-usuarios
