Inner join com três tabelas e varias linhas de uma tabela para o mesmo registro
Bom dia,
Gente... acho que o título ficou meio confuso mas preciso do seguinte:
eu tenho três tabelas: Emissoes, Duplicatas e ParcCom (parceiros comerciais)
a tabela de Emissões tem dados de conhecimentos eletrônicos, serviços de frete, por isso, cada linha da tabela de emissões tem de 2 a 4 parceiros comerciais (remetente, destinatário, consignatário e redespacho) e a tabela de duplicatas guarda faturas de cobrança que são vinculadas às emissões e indicam se os conhecimentos foram pagos ou não.
Eu preciso de um inner join que:
Me traga os dados que eu quiser da tabela Emissões, me traga da tabela ParcCom a RazaoSocial, o CNPJ, a Cidade e o Estado do remetente E do destinatário (dados de duas linhas da tabela parccom para um único resultado da tabela de emissões) e onde o campo "quitado" da tabela duplicatas for igual a zero (ainda em aberto) com um where especificando que devem ser mostradas apenas as emissões de um período específico que estiverem inclusas em uma fatura (where seqfatcob > 0)
até eu me perdi... mas alguém sabe como fazer isso?? desde já agradeço
Gente... acho que o título ficou meio confuso mas preciso do seguinte:
eu tenho três tabelas: Emissoes, Duplicatas e ParcCom (parceiros comerciais)
a tabela de Emissões tem dados de conhecimentos eletrônicos, serviços de frete, por isso, cada linha da tabela de emissões tem de 2 a 4 parceiros comerciais (remetente, destinatário, consignatário e redespacho) e a tabela de duplicatas guarda faturas de cobrança que são vinculadas às emissões e indicam se os conhecimentos foram pagos ou não.
Eu preciso de um inner join que:
Me traga os dados que eu quiser da tabela Emissões, me traga da tabela ParcCom a RazaoSocial, o CNPJ, a Cidade e o Estado do remetente E do destinatário (dados de duas linhas da tabela parccom para um único resultado da tabela de emissões) e onde o campo "quitado" da tabela duplicatas for igual a zero (ainda em aberto) com um where especificando que devem ser mostradas apenas as emissões de um período específico que estiverem inclusas em uma fatura (where seqfatcob > 0)
até eu me perdi... mas alguém sabe como fazer isso?? desde já agradeço
Aleksia Milas
Curtidas 0
Melhor post
Daniel Araújo
30/01/2017
Olá Aleksia!
Como não conheço a estrutura do banco e qual o SGDB, fiz um script de criação do banco em SQL Server, para em cima dele eu fazer o select.
O select ficou assim:
O segredo para fazer um join com a mesma tabela mais de uma vez é utilizar aliases.
Vê se tu consegue adaptar pra tua realidade. Espero ter ajudado!
Daniel Araújo
http://doispontozero-programador.blogspot.com.br/
Como não conheço a estrutura do banco e qual o SGDB, fiz um script de criação do banco em SQL Server, para em cima dele eu fazer o select.
CREATE DATABASE aleksia; GO USE aleksia; GO CREATE TABLE parceiro_comercial( id INT IDENTITY, razao_social VARCHAR(50) NOT NULL, cnpj VARCHAR(14) NOT NULL, cidade VARCHAR(50) NOT NULL, estado CHAR(2) NOT NULL, CONSTRAINT pk_parceiro_comercial PRIMARY KEY(id) ); GO CREATE TABLE emissao( id INT IDENTITY, data DATE NOT NULL, remetente_id INT NULL, destinatario_id INT NULL, consignatario_id INT NULL, redespacho_id INT NULL, CONSTRAINT pk_emissao PRIMARY KEY(id), CONSTRAINT fk_emissao_remetente FOREIGN KEY(remetente_id) REFERENCES parceiro_comercial(id), CONSTRAINT fk_emissao_destinatario FOREIGN KEY(destinatario_id) REFERENCES parceiro_comercial(id), CONSTRAINT fk_emissao_consignatario FOREIGN KEY(consignatario_id) REFERENCES parceiro_comercial(id), CONSTRAINT fk_emissao_redespacho FOREIGN KEY(redespacho_id) REFERENCES parceiro_comercial(id) ); GO CREATE TABLE duplicata( id INT IDENTITY, emissao_id INT NOT NULL, quitado TINYINT NOT NULL, CONSTRAINT pk_duplicata PRIMARY KEY(id), CONSTRAINT fk_duplicata_emissao FOREIGN KEY(emissao_id) REFERENCES emissao(id) ); GO
O select ficou assim:
SELECT ems.id
,rem.razao_social AS razao_social_remetente
,rem.cnpj AS cnpj_remetente
,rem.cidade AS cidade_remetente
,rem.estado AS estado_remetente
,des.razao_social AS razao_social_destinatario
,des.cnpj AS cnpj_destinatario
,des.cidade AS cidade_destinatario
,des.estado AS estado_destinatario
FROM emissao ems
INNER JOIN parceiro_comercial rem
ON ems.remetente_id = rem.id
INNER JOIN parceiro_comercial des
ON ems.destinatario_id = des.id
WHERE ems.id IN(SELECT emissao_id FROM duplicata WHERE quitado = 0)
AND ems.data BETWEEN '2017-01-01' AND '2017-01-31';
GOO segredo para fazer um join com a mesma tabela mais de uma vez é utilizar aliases.
Vê se tu consegue adaptar pra tua realidade. Espero ter ajudado!
Daniel Araújo
http://doispontozero-programador.blogspot.com.br/
GOSTEI 1