Query com 3 tabelas (relacionamento muitos-muitos)

Firebird

16/09/2004

Tenho 3 tabelas:

Motoristas Veiculos MotVei
Codigo Placa Placa
Nome Renavan CodMot
End Proprietario
... ....

Cada motorista pode ter varias placas cadastradas para si, assim como uma placa pode estar cadastrada pra varios motoristas

Preciso fazer um select sobre a tabela MotVei pra efeito de manutenção, para que o usuário possa retirar placas, motoristas

no caso o select que eu gostaria que fosse gerado digamos:

select MotVei.Placa, MotVei.CodMot, (alguns campos do Motoristas e alguns campos do Veiculos)


tentei com inner join:

SELECT
MOTVEI.CODMOT,
MOTVEI.PLACA,
MOTORISTAS.NOME,
VEICULOS.PROPRIETARIO
FROM
MOTVEI
INNER JOIN MOTORISTAS ON (MOTVEI.CODMOT = MOTORISTAS.CODIGO)
INNER JOIN VEICULOS ON (MOTVEI.PLACA = VEICULOS.PLACA)

ela me retorna sempre mull... tentei com algumas outras combinações e me retorna todo mundo relacionado com todo mundo mesmo que nao cadastrado no MotVei, pra teste tenho somente 2 relacionamento lá, e quando simplesmente o junto com o MOTORISTAS sem a tabela veiculo ele seciona correto, mas qdo junto a tabela veiculo bagunca tudo...

Se alguem souber uma solução

Desde já agradeço!!
Abraço


Tuskinhu

Tuskinhu

Curtidas 0

Respostas

Fsflorencio

Fsflorencio

16/09/2004

Coloque a estrutura das três tabelas (CREATE TABLE ...) e também a definição da chave primária para ficar mais fácil de resolver o problema.


GOSTEI 0
Tuskinhu

Tuskinhu

16/09/2004

Coloque a estrutura das três tabelas (CREATE TABLE ...) e também a definição da chave primária para ficar mais fácil de resolver o problema.


** motoristas **

CREATE TABLE MOTORISTAS (
CODIGO DM_CODIGO NOT NULL,
TIPO DM_TIPO DEFAULT ´´,
DATA_CADASTRO DM_DATA DEFAULT ´now´,
NOME DM_NOMES NOT NULL,
...
VCTO_CADASTRO DM_DATA,
OBS DM_OBS DEFAULT ´´,
ATUALIZADO DM_DATA DEFAULT ´now´);

ALTER TABLE MOTORISTAS ADD CONSTRAINT PK_MOTORISTAS PRIMARY KEY (CODIGO);

CREATE UNIQUE INDEX MOTORISTAS_CPF ON MOTORISTAS (CPF);
CREATE INDEX MOTORISTAS_NOME ON MOTORISTAS (NOME);
CREATE UNIQUE INDEX PK_MOTORISTAS ON MOTORISTAS (CODIGO);

** VEICULOS **

CREATE TABLE VEICULOS (
PLACA DM_PLACA NOT NULL,
PROPRIETARIO DM_NOMES,
CNPJCPF DM_CNPJCPF,
...
CAPACIDADE DM_CAPACIDADE,
OBS DM_OBS,
ATUALIZADO DM_DATA DEFAULT ´now´);

ALTER TABLE VEICULOS ADD CONSTRAINT PK_VEICULOS PRIMARY KEY (PLACA);

CREATE UNIQUE INDEX PK_VEICULOS ON VEICULOS (PLACA);


**MOTVEI***

CREATE TABLE MOTORISTVEICULOS (
MOTORISTA DM_CODIGO NOT NULL,
PLACA DM_PLACA NOT NULL,
ATUALIZADO DM_DATA DEFAULT ´now´);

ALTER TABLE MOTORISTVEICULOS ADD CONSTRAINT PK_MOTORISTVEICULOS PRIMARY KEY (MOTORISTA, PLACA);

CREATE INDEX ID_MOTVEI_MOTORISTA ON MOTORISTVEICULOS (MOTORISTA);
CREATE INDEX ID_MOTVEI_PLACA ON MOTORISTVEICULOS (PLACA);
CREATE UNIQUE INDEX PK_MOTORISTVEICULOS ON MOTORISTVEICULOS (MOTORISTA, PLACA);


GOSTEI 0
Fsflorencio

Fsflorencio

16/09/2004

Criei as três tabelas, coloquei um registro em cada tabela e fiz o select (com os ajustes, pois a uma tabela e alguns campos do select diferenciam do nome correto) e retornou beleza.
Para retornar nulo é possível que esteja faltando o registro em uma das tabelas.
Faça um teste com poucos registros e verifique o resultado.


GOSTEI 0
Tuskinhu

Tuskinhu

16/09/2004

Criei as três tabelas, coloquei um registro em cada tabela e fiz o select (com os ajustes, pois a uma tabela e alguns campos do select diferenciam do nome correto) e retornou beleza. Para retornar nulo é possível que esteja faltando o registro em uma das tabelas. Faça um teste com poucos registros e verifique o resultado.



eu estava fazendo o teste com poucos registros, mas uma das placas que eu tinha cadastrado nao estava no veiculos... deve ter sido ai o erro !!

obrigado pela ajuda!!!!!
Abraços


GOSTEI 0
POSTAR