Usuário com melhor resposta
Consulta complicada

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, produtoItemEspecificacaoIdFROM
tbProdutoItemEspecificacaoWHERE
(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
Respostas
-
O que vc acha:
Code SnippetCREATE
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 Snippetselect
ProdutoID,
ProdutoPaiID,
dbo.F_produtoItemEspecificacao(ProdutoID)
from tbl
group
by ProdutoID,ProdutoPaiID
go
Resultado:
26 25 8,2
27 25 3,8
29 28 2
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 SnippetSELECT produtoId
FROM tbProdutoItemEspecificacao
WHERE (produtoPaiId = 25) AND (produtoItemEspecificacaoId in (8,3)Ai vc postou
Code SnippetBom 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 SnippetSELECT 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. -
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
-
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
-
O que vc acha:
Code SnippetCREATE
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 Snippetselect
ProdutoID,
ProdutoPaiID,
dbo.F_produtoItemEspecificacao(ProdutoID)
from tbl
group
by ProdutoID,ProdutoPaiID
go
Resultado:
26 25 8,2
27 25 3,8
29 28 2
-
-