Usuário com melhor resposta
SELECT Com JOIN

Pergunta
-
Esta ocorrendo um problema com um select, que eu nao esperava que aconteceria. Antes de eu montar uma solucao para esse problema, gostaria de saber a opiniao de voces, para que eu possa resolver da melhor forma possivel.
Para poder explicar na pratica, vamos ter que criar umas tabelas:
Code Snippet
CREATE TABLE [dbo].[Tb_Clientes] (
[Cliente] [int] NOT NULL ,
[Nome] [varchar] (100) COLLATE Latin1_General_CI_AS NOT NULL ,
[UF] [char] (2) COLLATE Latin1_General_CI_AS NOT NULL
) ON [PRIMARY]
GOINSERT INTO Tb_Clientes VALUES(1, 'Jose', 'SP')
INSERT INTO Tb_Clientes VALUES(2, 'Antonio', 'SP')
INSERT INTO Tb_Clientes VALUES(3, 'Marcio', 'MG')
INSERT INTO Tb_Clientes VALUES(4, 'Alberto', 'RJ')
INSERT INTO Tb_Clientes VALUES(5, 'Joaquim', 'SP')CREATE TABLE [dbo].[Tb_ICMS] (
[ICMS] [int] NOT NULL ,
[Descricao] [varchar] (50) COLLATE Latin1_General_CI_AS NOT NULL
) ON [PRIMARY]
GOINSERT INTO Tb_ICMS VALUES(1, 'Tributado Integralmente')
INSERT INTO Tb_ICMS VALUES(2, 'Substituicao Tributaria')CREATE TABLE [dbo].[Tb_ICMSUF] (
[ICMS_UF] [int] NOT NULL ,
[ICMS] [int] NOT NULL ,
[UF] [char] (2) COLLATE Latin1_General_CI_AS NOT NULL ,
[Aliquota] [decimal](18, 2) NOT NULL
) ON [PRIMARY]
GOINSERT INTO Tb_ICMSUF VALUES(1, 1, 'SP', 18)
INSERT INTO Tb_ICMSUF VALUES(2, 1, 'MG', 7)
INSERT INTO Tb_ICMSUF VALUES(3, 1, 'RJ', 12)
INSERT INTO Tb_ICMSUF VALUES(4, 2, 'SP', 0)
INSERT INTO Tb_ICMSUF VALUES(5, 2, 'RJ', 0)
INSERT INTO Tb_ICMSUF VALUES(6, 2, 'MG', 0)CREATE TABLE [dbo].[Tb_Produtos] (
[Produto] [int] NOT NULL ,
[Descricao] [varchar] (100) COLLATE Latin1_General_CI_AS NOT NULL ,
[ICMS] [int] NOT NULL
) ON [PRIMARY]
GOINSERT INTO Tb_Produtos VALUES(1, 'Arroz', 1)
INSERT INTO Tb_Produtos VALUES(2, 'Feijao', 1)
INSERT INTO Tb_Produtos VALUES(3, 'Bolacha', 2)
INSERT INTO Tb_Produtos VALUES(4, 'Macarrao', 1)
INSERT INTO Tb_Produtos VALUES(5, 'Picanha', 1)CREATE TABLE [dbo].[Tb_Venda] (
[Venda] [int] NOT NULL ,
[Cliente] [int] NOT NULL
) ON [PRIMARY]
GOINSERT INTO Tb_Venda VALUES(1, 1)
INSERT INTO Tb_Venda VALUES(2, 2)
INSERT INTO Tb_Venda VALUES(3, 3)
INSERT INTO Tb_Venda VALUES(4, 4)
INSERT INTO Tb_Venda VALUES(5, 5)
INSERT INTO Tb_Venda VALUES(6, 1)
INSERT INTO Tb_Venda VALUES(7, 2)
INSERT INTO Tb_Venda VALUES(8, 3)
INSERT INTO Tb_Venda VALUES(9, 4)
INSERT INTO Tb_Venda VALUES(10, 5)
INSERT INTO Tb_Venda VALUES(11, 1)
INSERT INTO Tb_Venda VALUES(12, 2)
INSERT INTO Tb_Venda VALUES(13, 3)CREATE TABLE [dbo].[Tb_VendaProduto] (
[ID] [int] NOT NULL ,
[Venda] [int] NOT NULL ,
[Produto] [int] NOT NULL,
[Qtde] [decimal](18, 2) NOT NULL
) ON [PRIMARY]
GOINSERT INTO Tb_VendaProduto VALUES(1, 1, 1, 5)
INSERT INTO Tb_VendaProduto VALUES(2, 1, 2, 6)
INSERT INTO Tb_VendaProduto VALUES(3, 1, 3, 7)
INSERT INTO Tb_VendaProduto VALUES(4, 1, 4, 8)
INSERT INTO Tb_VendaProduto VALUES(5, 1, 5, 9)INSERT INTO Tb_VendaProduto VALUES(6, 2, 1, 5)
INSERT INTO Tb_VendaProduto VALUES(7, 2, 2, 6)
INSERT INTO Tb_VendaProduto VALUES(8, 2, 3, 7)
INSERT INTO Tb_VendaProduto VALUES(9, 2, 4, 8)
INSERT INTO Tb_VendaProduto VALUES(10, 2, 5, 9)INSERT INTO Tb_VendaProduto VALUES(11, 3, 1, 5)
INSERT INTO Tb_VendaProduto VALUES(12, 3, 2, 6)
INSERT INTO Tb_VendaProduto VALUES(13, 3, 3, 7)
INSERT INTO Tb_VendaProduto VALUES(14, 3, 4, 8)
INSERT INTO Tb_VendaProduto VALUES(15, 3, 5, 9)INSERT INTO Tb_VendaProduto VALUES(16, 4, 1, 5)
INSERT INTO Tb_VendaProduto VALUES(17, 4, 2, 6)
INSERT INTO Tb_VendaProduto VALUES(18, 4, 3, 7)
INSERT INTO Tb_VendaProduto VALUES(19, 4, 4, 8)
INSERT INTO Tb_VendaProduto VALUES(20, 4, 5, 9)INSERT INTO Tb_VendaProduto VALUES(21, 5, 1, 5)
INSERT INTO Tb_VendaProduto VALUES(22, 5, 2, 6)
INSERT INTO Tb_VendaProduto VALUES(23, 5, 3, 7)
INSERT INTO Tb_VendaProduto VALUES(24, 5, 4, 8)
INSERT INTO Tb_VendaProduto VALUES(25, 5, 5, 9)Eu sei que deveria ter PK, FK, mas para nosso exemplo acredito que nao é necessario.
O problema que estou tendo é que preciso trazer a aliquota de acordo com a tabela de ICMS e o UF do cliente.
Estou fazendo um SELECT e esta duplicando os itens de acordo com a quantidade de UF disponivel.
Code SnippetSELECT dbo.Tb_Venda.Venda,
dbo.Tb_Venda.Cliente,
dbo.Tb_Clientes.Nome,
dbo.Tb_Clientes.UF,
dbo.Tb_VendaProduto.Produto,
dbo.Tb_Produtos.Descricao AS DescricaoProduto,
dbo.Tb_VendaProduto.Qtde,
dbo.Tb_Produtos.ICMS,
dbo.Tb_ICMS.Descricao AS DescricaoICMS,
dbo.Tb_ICMSUF.Aliquota
FROM dbo.Tb_Venda INNER JOIN
dbo.Tb_Clientes ON dbo.Tb_Venda.Cliente = dbo.Tb_Clientes.Cliente INNER JOIN
dbo.Tb_VendaProduto ON dbo.Tb_Venda.Venda = dbo.Tb_VendaProduto.Venda INNER JOIN
dbo.Tb_Produtos ON dbo.Tb_VendaProduto.Produto = dbo.Tb_Produtos.Produto INNER JOIN
dbo.Tb_ICMS ON dbo.Tb_Produtos.ICMS = dbo.Tb_ICMS.ICMS INNER JOIN
dbo.Tb_ICMSUF ON dbo.Tb_ICMS.ICMS = dbo.Tb_ICMSUF.ICMS
ORDER BY dbo.Tb_Venda.VendaSe estou usando um INNER JOIN entre:
Tabela de Produtos e ICMS
Tabela de ICMS e ICMSUF
Tabela de Clientes e ICMSUF
Isso nao deveria trazer somente o ICMS relacionado ao UF do cliente, e a Tabela de ICMS do Produto ??
Obrigado !!!
Respostas
-
Boa tarde Sr. Davi
O seu problema está no último JOIN faltou você fazer a referência da UF na tabela TB_ICMSUF, segue abaixo o código
SELECT
dbo.Tb_Venda.Venda,dbo.Tb_Venda.Cliente,
dbo.Tb_Clientes.Nome,
dbo.Tb_Clientes.UF,
dbo.Tb_VendaProduto.Produto,
dbo.Tb_Produtos.Descricao AS DescricaoProduto,
dbo.Tb_VendaProduto.Qtde,
dbo.Tb_Produtos.ICMS,
dbo.Tb_ICMS.Descricao AS DescricaoICMS--,
--dbo.Tb_ICMSUF.Aliquota
FROM
dbo.Tb_Venda
INNER
JOINdbo.Tb_Clientes ON dbo.Tb_Clientes.Cliente = dbo.Tb_Venda.Cliente
INNER
JOINdbo.Tb_VendaProduto ON dbo.Tb_VendaProduto.Venda = dbo.Tb_Venda.Venda
INNER
JOINdbo.Tb_Produtos ON dbo.Tb_Produtos.Produto = dbo.Tb_VendaProduto.Produto
INNER
JOINdbo.Tb_ICMS ON dbo.Tb_ICMS.ICMS = dbo.Tb_Produtos.ICMS
INNER
JOINdbo.Tb_ICMSUF ON dbo.Tb_ICMSUF.ICMS = dbo.Tb_ICMS.ICMS and dbo.Tb_ICMSUF.UF = Tb_Clientes.UF
ORDER
BYdbo.Tb_Venda.Venda