Fórum Select em varias tabelas... #334639
13/12/2006
0
Estou com o seguinte problema: ´Tenho tres tabelas para cadastro de clientes, fornecedores, pessoa fisica e pessoa juridica: CLIFOR, PESSOAFISICA e PESSOAJURIDICA. Agora, estou precisando fazer uma uniao dos clientes, idependente de que sejam PESSOA FISICA ou PESSOA JURIDICA. Se eu utilizar um INNER JOIN normalmente, dá certo, no entanto, o campo CPF que é de cliente PESSOAFISICA, ficara em branco quando o cadastro é de PESSOAJURIDICA, e o mesmo acontece com o CNPJ quendo o cliente é PESSOAFISICA. Como montar uma query que faça a uniao dessas informações e exiba tudo em uma unica tupla, sem que fique campos vazios. Fiz a seguinte query:
SELECT CLF_CLIFOR.ID_CLIFOR, CLF_CLIFOR.CODCF, CLF_CLIFOR.TIPO, CLF_CLIFOR.PESSOA, CLF_CLIFOR.NOME, CLF_PESSOAFISICA.CPF AS "CNPJ/CPF" FROM CLF_CLIFOR INNER JOIN CLF_PESSOAFISICA ON CLF_CLIFOR.ID_CLIFOR = CLF_PESSOAFISICA.ID_CLIFOR UNION SELECT CLF_CLIFOR.ID_CLIFOR, CLF_CLIFOR.CODCF, CLF_CLIFOR.TIPO, CLF_CLIFOR.PESSOA, CLF_CLIFOR.NOME, CLF_PESSOAJURIDICA.CNPJ AS "CNPJ/CPF" FROM CLF_CLIFOR INNER JOIN CLF_PESSOAJURIDICA ON CLF_CLIFOR.ID_CLIFOR = CLF_PESSOAJURIDICA.ID_CLIFOR
Dynamic SQL Error SQL error code = -104 Invalid command Data type unknown Statement: SELECT * FROM LISTACLIENTE UNION SELECT * FROM LISTAFORNECEDOR
Alguem pode me ajudar com isso?
Marcelo
Curtir tópico
+ 0Posts
13/12/2006
Arc
Gostei + 0
13/12/2006
Marcelo
Gostei + 0
13/12/2006
Arc
estou tentando simular esse seu select, vamos ver se da o mesmo erro :D
Gostei + 0
13/12/2006
Arc
pq das tabelas CLF_PESSOAJURIDICA e CLF_PESSOAFISICA ???
Gostei + 0
13/12/2006
Emerson Nascimento
SELECT CLF_CLIFOR.ID_CLIFOR, CLF_CLIFOR.CODCF, CLF_CLIFOR.TIPO, CLF_CLIFOR.PESSOA, CLF_CLIFOR.NOME, isnull(CLF_PESSOAJURIDICA.CNPJ, CLF_PESSOAFISICA.CPF) AS "CNPJ/CPF" FROM CLF_CLIFOR LEFT JOIN CLF_PESSOAFISICA ON CLF_PESSOAFISICA.ID_CLIFOR = CLF_CLIFOR.ID_CLIFOR LEFT JOIN CLF_PESSOAJURIDICA ON CLF_PESSOAJURIDICA.ID_CLIFOR = CLF_CLIFOR.ID_CLIFOR
ou simplesmente inverta as instruções. procure primeiro na tabela de pessoas jurídicas e depois na de pessoas físicas, visto que o campo maior pode conter o menor, mas o contrário não é verdadeiro.
como você não informou qual o banco de dados, a instrução foi ilustrada utilizando [i:c6fcdd045f]isnull()[/i:c6fcdd045f], que é uma função do SQL Server. no caso de usar Firebird, troque por [i:c6fcdd045f]coalesce()[/i:c6fcdd045f], ou [i:c6fcdd045f]nvl()[/i:c6fcdd045f] se usar oracle
e faço minha a pergunta anterior: porque CLF_PESSOAJURIDICA e CLF_PESSOAFISICA ?
Gostei + 0
13/12/2006
Arc
eu não sei se é isso mesmo, mas pelo que eu entendi desse modelo de dados os campos CLF_PESSOAJURIDICA.CNPJ e CLF_PESSOAFISICA.CPF nunca serão nulas !!!!!
Gostei + 0
13/12/2006
Arc
SELECT
CLF_CLIFOR.ID_CLIFOR, CLF_CLIFOR.CODCF, CLF_CLIFOR.TIPO, CLF_CLIFOR.PESSOA, CLF_CLIFOR.NOME,
CASE CLF_CLIFOR.TIPO
WHEN ´J´ THEN CLF_PESSOAJURIDICA.CNPJ
ELSE CLF_PESSOAFISICA.CPF
END
AS ´CNPJ/CPF´
FROM
CLF_CLIFOR
LEFT JOIN
CLF_PESSOAFISICA ON CLF_PESSOAFISICA.ID_CLIFOR = CLF_CLIFOR.ID_CLIFOR
LEFT JOIN
CLF_PESSOAJURIDICA ON CLF_PESSOAJURIDICA.ID_CLIFOR = CLF_CLIFOR.ID_CLIFOR
Gostei + 0
13/12/2006
Arc
SELECT
CLF_CLIFOR.ID_CLIFOR, CLF_CLIFOR.CODCF, CLF_CLIFOR.TIPO, CLF_CLIFOR.PESSOA, CLF_CLIFOR.NOME,
CASE CLF_CLIFOR.TIPO
WHEN ´J´ THEN CLF_PESSOAJURIDICA.CNPJ
ELSE CLF_PESSOAFISICA.CPF
END
AS ´CNPJ/CPF´
FROM
CLF_CLIFOR
LEFT JOIN
CLF_PESSOAFISICA ON CLF_PESSOAFISICA.ID_CLIFOR = CLF_CLIFOR.ID_CLIFOR
LEFT JOIN
CLF_PESSOAJURIDICA ON CLF_PESSOAJURIDICA.ID_CLIFOR = CLF_CLIFOR.ID_CLIFOR
Gostei + 0
13/12/2006
Emerson Nascimento
claro que poderá ser nulo.
um cliente não pode ser ao mesmo tempo pessoa física e pessoa jurídica. se for pessoa física, o valor de pessoa jurídica será nulo, e vice-versa.
Gostei + 0
13/12/2006
Arc
Gostei + 0
13/12/2006
Emerson Nascimento
por isso optei pelo [i:69e764bf88]isnull()[/i:69e764bf88] ao invés do [i:69e764bf88]case[/i:69e764bf88].
Gostei + 0
14/12/2006
Arc
mas e aí marcelo, conseguiu resolver o seu problema???
Gostei + 0
16/12/2006
Marcelo
Olha, o lance é o seguinte: eu modelei o BD totalmente normalizado, por isso criei varias entidades contendo informações pertinentes a cada cadastro. A tabela CLIFOR é para cadastro de CLIENTE e FORNECEDOR independente de ser PESSOA JURIDICA ou PESSOA FISICA. Criei também outras entidades como PESSOAJURIDICA, PESSOAFISICA, CLIENTE, etc. Tendo sempre aquele critério de que dados de cliente são dados de clientes, dados de pessoa física são dados de pessoa física, dados de pessoa jurídica são dados de pessoa jurídica e assim por diante. As informações que todos têm em comum, ficam armazenadas na entidade CLIFOR. Respondi a dúvida quanto a isso?
Agora a respeito do UNION, optei por modificar o tipo da estrutura do banco, deixando tanto CPF quanto CNPJ como CHAR(14). O IB/FB funciona da seguinte maneira: quando você cria algum campo em uma determinada tabela, o IB/FB cria uma DOMAIN interna, representando o tipo juntamente com o tamanho do campo, essa DOMAIN será utilizada internamente sempre que você criar outro campo com o mesmo tipo e tamanho. O UNION apenas funciona quando os DOMAINS das tabelas de união são idênticos, caso contrario ocorre um erro de incompatibilidade de tipo. Valeu a informação?
Gente, muito obrigado pela força e achei interessante a curiosidade de vocês.
Um abraço a todos!!!
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)