[firebase-br] LEFT JOIN com a propria tabela nao funciona

Daniel / Tecnobyte temp em tecnobyte.com.br
Sex Maio 26 20:56:54 -03 2006


Considere a tabela:

CREATE TABLE Pessoa(
  Id           INTEGER NOT NULL,
  Nome         VARCHAR(40) NOT NULL,
  NomeUsual    VARCHAR(40) NOT NULL,
  TipoPessoa   VARCHAR(8) NOT NULL, /* FÍSICA, JURÍDICA */
  Sucedida_Id  INTEGER,
  Coligada_Id  INTEGER,
  DataCadastro DATE NOT NULL,
  CONSTRAINT PK_Pessoa PRIMARY KEY(Id));

O SELECT abaixo não retorna nenhum registro, mesmo tendo certeza de que há
um registro na tabela pessoa:

SELECT
  Pessoa.Id,
  Pessoa.Nome,
  Pessoa.NomeUsual,
  Pessoa.TipoPessoa,
  Pessoa.Sucedida_Id,
  Sucedida.Nome AS Sucedida_Nome,
  Pessoa.Coligada_Id,
  Coligada.Nome AS Coligada_Nome,
  Pessoa.DataCadastro
FROM Pessoa
LEFT OUTER JOIN Pessoa Sucedida ON Sucedida.Id = Pessoa.Sucedida_Id
LEFT OUTER JOIN Pessoa Coligada ON Coligada.Id = Pessoa.Coligada_Id
ORDER BY Pessoa.Nome

Por enquanto resolvi o problema criando as duas VIEWs abaixo:

CREATE VIEW PessoaSucedida AS SELECT * FROM Pessoa;
CREATE VIEW PessoaColigada AS SELECT * FROM Pessoa;

E alterando o SELECT para:

SELECT
  Pessoa.Id,
  Pessoa.Nome,
  Pessoa.NomeUsual,
  Pessoa.TipoPessoa,
  Pessoa.Sucedida_Id,
  PessoaSucedida.Nome AS Sucedida_Nome,
  Pessoa.Coligada_Id,
  PessoaColigada.Nome AS Coligada_Nome,
  Pessoa.DataCadastro
FROM Pessoa
LEFT OUTER JOIN PessoaSucedida ON PessoaSucedida.Id = Pessoa.Sucedida_Id
LEFT OUTER JOIN PessoaColigada ON PessoaColigada.Id = Pessoa.Coligada_Id
ORDER BY Pessoa.Nome

Entretanto não acredito que o correto seria permitir o LEFT JOIN diretamente
com a tabela principal. Se alguém souber de algo sobre isto, ficarei feliz
se compartilhar comigo.

Estou usando Firebird 1.5.2.4731 em Windows XP.

Atenciosamente.

Daniel P. Guimarães
Tecnobyte Informática
www.tecnobyte.com.br






Mais detalhes sobre a lista de discussão lista