Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

ERRO NO INNER JOIN

Boa tarde.

Estou com um problema na hora de fazer um INNER JOIN entre as minhas tabelas.

Minha ideia e fazer um INNER JOIN entre as tabelas produto, registro, checklist e vincular aonde me retornar o nome de todas as linhas da coluna nome da tabela checklist que tem relação entre produto e registro, mas como em todas as tabelas tem uma coluna chamado nome acabe dando erro.

Minhas tabelas são essas :

CREATE TABLE produto(
id INT NOT NULL AUTO_INCREMENT,
nome VARCHAR(250) NOT NULL,
PRIMARY KEY(id)
);
CREATE TABLE registro(
id INT NOT NULL AUTO_INCREMENT,
nome VARCHAR(250) NOT NULL,
PRIMARY KEY(id)
);
CREATE TABLE checklist(
id INT NOT NULL AUTO_INCREMENT,
nome VARCHAR(250) NOT NULL,

PRIMARY KEY(id)
);
CREATE TABLE vincular( 
id INT NOT NULL auto_increment PRIMARY KEY, 
vincular_descricao VARCHAR(250) NOT NULL, 
id_produto INT NOT NULL, 
id_registro INT NOT NULL,
id_checklist INT NOT NULL, 
FOREIGN KEY (id_produto)
REFERENCES produto(id)
ON DELETE CASCADE,
FOREIGN KEY (id_registro)
REFERENCES registro(id)
ON DELETE CASCADE,
FOREIGN KEY (id_checklist)
REFERENCES checklist(id)
ON DELETE CASCADE
);

O algorítimo que estou usando esta sendo esse mas ocorre erro. Ja tentei ate apelidar a tabela mas ocorre erro da mesma maneira.

SELECT nome FROM vincular INNER JOIN checklist ON checklist.id = vincular.id_checklist
INNER JOIN produto ON produto.id= 3  and vincular.id_produto =3
INNER JOIN registro ON registro.id= 1  and vincular.id_registro =1;

Alguém consegue me ajudar ?

3 respostas

Oii Thayron, tudo bem?

De qual tabela você tá querendo trazer o nome?

Boa tarde Maria Gabriela Cuenca Oliva tudo bem ?.

Estava querendo retornar a coluna nome da tabela checklist, mas só se tiver relação com as tabelas produto e registro. Para isso criei a tabela vincular que tem a chave estrangeira de todo mundo.

Eu fiz da seguinte forma:

SELECT c.nome FROM checklist c INNER JOIN vincular v ON c.id = v.id_checklist
INNER JOIN produto p ON p.id= 3  and v.id_produto =3
INNER JOIN registro r ON r.id= 1  and v.id_registro =1;

Dessa forma e uma forma correta de fazer ?

Aparentemente está retornando certinho.

solução!

Oii Thayron,

A sua consulta está correta, entretanto, não precisamos de uma tabela vincular com todos os ids, já que a tabela checklist possui a chave estrangeira das outras tabelas. Foi só um retrabalho e ocupação indevida de memória. Eu ainda tenho a estrutura anterior do seu banco e a consulta ficou assim:

select c.nome from checklist c

inner join produto p on p.id = c.id_produto
inner join registro r on r.id = c.id_registro

where c.id_produto = 3 or c.id_registro = 1

Nesse caso devemos usar um WHERE com OR. Se usarmos o WHERE com AND irá nos retornar o nome vazio, pois com o AND as duas condições precisam ser verdadeiras para nos retornar o resultado. Já o OR, pelo menos uma das condições precisam ser verdadeiras para nos retornar o resultado.

Mas porque não usar o OR no join? Porque se colocarmos, vai nos trazer tuplas repetidas.

Espero ter ajudado. Qualquer dúvida estou por aqui, tá bom? :)