none
Consulta complicada RRS feed

  • Pergunta

  • Boa tarde pessoal,

     

    Tenho a seguinte tabela

    produtoId                         produtoPaiId                      especificacaoId                        produtoItemEspecificacaoId

    27                                   25                                     1                                            3

    27                                   25                                     4                                            8

    26                                   25                                     4                                            8

    26                                   25                                     1                                            2

    29                                   28                                     1                                            2

     

     

    Preciso selecionar o produtoId dessa tabela acima que tenha o produtoItemEspecificacaoId 8 e 3.

    Vai ter situacoes em que o produto poderá ter 3 produtoItemEspecificacaoId ou mais.

     

    Se as especificacoes tivesse na mesma linha seria isso

    select * from tbProdutoItemEspecificacao where produtoPaiId = 25 and (produtoItemEspecificacaoId = 8 and produtoItemEspecificacaoId = 3)

     

    Como estão em linhas separadas isso não resolve.

     

    Da maneira abaixo ele funciona:

    SELECT produtoId, produtoPaiId, produtoItemEspecificacaoId

    FROM tbProdutoItemEspecificacao

    WHERE (produtoPaiId = 25) AND (produtoItemEspecificacaoId IN (8, 3)) AND (produtoId <> 26)

     

    Só que quando coloco (8,4) ele também retorna o produtoId 27 e na verdade não tenho um produtoPaiId 25 que tenha especificacao (8 e 4).

     

    Gustavo

    segunda-feira, 7 de abril de 2008 19:53

Respostas

  • O que vc acha:

     

    Code Snippet

    CREATE FUNCTION F_produtoItemEspecificacao(@ProdutoID INT) RETURNS VARCHAR(1000)

    AS

    BEGIN

    Declare @ListaID VARCHAR(1000)

    Declare @ProdutoItemEspecificacaoId int

    Select @ListaID = ''

    Select @ListaID = @ListaID + convert(varchar(20),produtoItemEspecificacaoId) + ','

    From tbl Where ProdutoID = @ProdutoID

    IF NOT (@ListaID IS NULL)

    BEGIN

    SELECT @ListaID = SUBSTRING(@ListaID, 1, LEN(@ListaID)-1)

    END

    RETURN @ListaID

    END

    go

     

     

    Code Snippet

    select

    ProdutoID,

    ProdutoPaiID,

    dbo.F_produtoItemEspecificacao(ProdutoID)

    from tbl

    group by ProdutoID,

    ProdutoPaiID

    go

     

     

    Resultado:

     

    ProductID  ProdutoPaiID  Resultado
    26             25        8,2
    27             25        3,8
    29             28        2


     

    terça-feira, 8 de abril de 2008 02:33

Todas as Respostas

  • Gustavo,

     

    Eu acompanhei com algumas sugestão desse problema no link

    http://forums.microsoft.com/msdn-br/ShowPost.aspx?PostID=3132376&SiteID=21

     

    Apresentei a seguinte solução (Além de diversas sugestões do Gustavo Maia Aguiar)

    Code Snippet
    SELECT produtoId
    FROM tbProdutoItemEspecificacao
    WHERE (produtoPaiId = 25) AND (produtoItemEspecificacaoId in (8,3)

     

     

    Ai vc postou


    Code Snippet

    Bom dia Laercio,


    Não seria exatamente isso. Dessa maneira ele me retorna todos os produtoPaiId = 25
    onde os produtoItemEspecificacaoId for (8,3)


    Preciso que retorne o produtoPaiId 25 onde produtoItemEspecificacaoId seja 8 e 3.

     

     

    Com base na sua resposta acima, a minha sugestão seria criar um UNION

     

    Code Snippet

    SELECT produtoId
    FROM tbProdutoItemEspecificacao WHERE (produtoPaiId = 25) AND (produtoItemEspecificacaoId =8)

     

    UNION

     

    SELECT produtoId
    FROM tbProdutoItemEspecificacao WHERE (produtoPaiId = 25) AND (produtoItemEspecificacaoId =3)

     

     

    Caso não resolva, altere o seu exemplo e monte uma tabela com mais detalhes de como seria o resultado do SQL

     

    Ajude a melhorar o nosso Fórum!
    Não esqueça de marca a mensagem como "útil", caso tenha ajudado.

    segunda-feira, 7 de abril de 2008 20:20
  • Ainda não funcionou.

     

    Seguinte, tenho um cadastro de produtos. Cada produto tem o seu produtoPaiId, e cada produto pode ter varias especificacoes(cores, sabores, tamnho, numeracao, etc).

     

    Preciso descobrir o produtoId conforme as especificacoes selecionadas. Ex

    cores seleciono no drop a opcao branco q é a 8

    sabor seleciono no drop a especificacao uva que é a 3

     

    Já tenho na minha querystring o produtoPaiId. Preciso descobrir qual é o produtoId que tem especificacao 8 e 3 e que seu produtoPaiId seja 25.

     

    Deu para enterder?

    Gustavo

    segunda-feira, 7 de abril de 2008 20:59
  •  

    Se possível cria essa tabela

     

    CREATE TABLE tbl (
    ProdutoID INT,
    ProdutoPaiID INT,
    EspecificacaoID INT,
    produtoItemEspecificacaoId INT)

    INSERT INTO tbl VALUES (27,25,1,3)
    INSERT INTO tbl VALUES (27,25,4,8)
    INSERT INTO tbl VALUES (26,25,4,8)
    INSERT INTO tbl VALUES (26,25,1,2)
    INSERT INTO tbl VALUES (29,28,1,2)

     

    Tenta fazer um select que traga o produtoId do produtoPaiId = 25 e que produtoItemEspecificacaoId sejam igual a 8 e 3.

     

    Gustavo

    segunda-feira, 7 de abril de 2008 21:06
  • O que vc acha:

     

    Code Snippet

    CREATE FUNCTION F_produtoItemEspecificacao(@ProdutoID INT) RETURNS VARCHAR(1000)

    AS

    BEGIN

    Declare @ListaID VARCHAR(1000)

    Declare @ProdutoItemEspecificacaoId int

    Select @ListaID = ''

    Select @ListaID = @ListaID + convert(varchar(20),produtoItemEspecificacaoId) + ','

    From tbl Where ProdutoID = @ProdutoID

    IF NOT (@ListaID IS NULL)

    BEGIN

    SELECT @ListaID = SUBSTRING(@ListaID, 1, LEN(@ListaID)-1)

    END

    RETURN @ListaID

    END

    go

     

     

    Code Snippet

    select

    ProdutoID,

    ProdutoPaiID,

    dbo.F_produtoItemEspecificacao(ProdutoID)

    from tbl

    group by ProdutoID,

    ProdutoPaiID

    go

     

     

    Resultado:

     

    ProductID  ProdutoPaiID  Resultado
    26             25        8,2
    27             25        3,8
    29             28        2


     

    terça-feira, 8 de abril de 2008 02:33
  •  

    Opa funcionou.

     

    Vlw cara

     

    Gustavo

    terça-feira, 8 de abril de 2008 14:53
  • btguga,

    Essa foi dificil para resolver! Fico feliz por ter ajudado!

    Valeu!
    terça-feira, 8 de abril de 2008 15:18