Fórum Inner join com três tabelas e varias linhas de uma tabela para o mesmo registro #574358

30/01/2017

0

SQL

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
Aleksia Milas

Aleksia Milas

Responder

Post mais votado

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.

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';
GO


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/

Daniel Araújo

Daniel Araújo
Responder

Gostei + 1

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar