none
SELECT Com JOIN RRS feed

  • 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]
    GO

    INSERT 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]
    GO

    INSERT 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]
    GO

    INSERT 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]
    GO

    INSERT 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]
    GO

    INSERT 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]
    GO

    INSERT 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 Snippet

     

    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 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.Venda

     

     

    Se 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 !!!

     

     

     

    quinta-feira, 25 de setembro de 2008 14:25

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 JOIN

    dbo.Tb_Clientes ON dbo.Tb_Clientes.Cliente = dbo.Tb_Venda.Cliente

    INNER JOIN

    dbo.Tb_VendaProduto ON dbo.Tb_VendaProduto.Venda = dbo.Tb_Venda.Venda

    INNER JOIN

    dbo.Tb_Produtos ON dbo.Tb_Produtos.Produto = dbo.Tb_VendaProduto.Produto

    INNER JOIN

    dbo.Tb_ICMS ON dbo.Tb_ICMS.ICMS = dbo.Tb_Produtos.ICMS

    INNER JOIN

    dbo.Tb_ICMSUF ON dbo.Tb_ICMSUF.ICMS = dbo.Tb_ICMS.ICMS and dbo.Tb_ICMSUF.UF = Tb_Clientes.UF

    ORDER BY

    dbo.Tb_Venda.Venda

     

    quinta-feira, 25 de setembro de 2008 15:33