none
Produto diferente RRS feed

  • Pergunta

  • Bom dia

    Tenho a seguinte query abaixo

    SELECT distinct p.Nome_Produto, p.Preco_produto, p.TipoProduto ,SUBSTRING((SELECT distinct ',' + i.Nome_Ingrediente
                                         FROM Ingrediente i
                                         INNER JOIN ProdutoxIngrediente pri ON pri.ID_Ingrediente = i.ID_Ingrediente
                                         WHERE pri.ID_Produto = p.ID_Produto        
                                         FOR XML PATH('')),2,200000) AS Ingredientes from Ingrediente i
                                         INNER JOIN ProdutoxIngrediente pri on pri.ID_Ingrediente = i.ID_Ingrediente
                                         INNER JOIN Produto p on p.ID_Produto = pri.ID_Produto
                                         WHERE i.Nome_Ingrediente = @nome

    ela me retorna os ingredientes que contem nas  pizzas cadastradas

    so que quando eu coloco o sinal de diferente <> na linha WHERE i.Nome_Ingrediente <> @nome

    ele me retorna as pizzas com o ingrediente q justamente nao deve ter....como proceder?

    so quero exibir as pizzas que não tenha determinado ingrediente

    segunda-feira, 15 de julho de 2013 13:26

Respostas

  • Bom dia,

    Tavares, experimente dessa forma:

    SELECT
        p.Nome_Produto, 
        p.Preco_produto, 
        p.TipoProduto,
        SUBSTRING(
            (SELECT distinct ',' + i.Nome_Ingrediente 
             FROM Ingrediente i 
             INNER JOIN ProdutoxIngrediente pri ON pri.ID_Ingrediente = i.ID_Ingrediente
             WHERE pri.ID_Produto = p.ID_Produto        
             FOR XML PATH('')), 2, 200000) AS Ingredientes 
    from Produto p
    where
        not exists
            (select 1 from Ingrediente i
             INNER JOIN ProdutoxIngrediente pri on pri.ID_Ingrediente = i.ID_Ingrediente
             where 
                 i.Nome_Ingrediente = @nome and
                 pri.ID_Produto = p.ID_Produto)

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    segunda-feira, 15 de julho de 2013 13:44

Todas as Respostas

  • Tavares,

    Não sei ao certo se entendi sua duvida, creio que o que esta acontecendo é isso:

    @nome = 'Linguiça calabresa'

    Voce tem:

    Pizza Ingrediente

    Mussarela Queijo

    Mussarela Tomate

    Calabresa Tomate

    Calabresa Linguiça calabresa

    E ao colocar sua expressão ele deveria sumir as 2 linhas da pizza Calabresa, porem sobe apenas a linha onde o Ingrediente é Linguiça calabresa mantendo a de tomate no select. É isso mesmo?


    Fabrizzio A. Caputo
    Certificações:
    MCT
    MCC
    Oracle OCA 11g
    MCTS SQL Server 2008 BI
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    ITIL V3 Foundation
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Email: fabrizzio.antoniaci@gmail.com

    segunda-feira, 15 de julho de 2013 13:31
    Moderador
  • entao ele deveria trazer as duas primeiras linhas do exemplo que vc deu, mas ele tbm ta trazendo as pizzas q contem a calabresa,sendo q nao deveria trazer

    Pizza Cheddar    18.00    Pizza    Cheddar  Molho de Tomate

    Pizza de Calabresa    15.00    Pizza    Calabresa  Molho de Tomate

    Pizza Portuguesa    21.00    Pizza    Calabresa  Molho de Tomate  Orégano

    tenho esses dados

    na query q to fazendo pra trazer o que nao tem calabresa, ele ta trazendo tbm

    • Editado Tavares.Aquino segunda-feira, 15 de julho de 2013 13:42 atualizar
    segunda-feira, 15 de julho de 2013 13:39
  • Bom dia,

    Tavares, experimente dessa forma:

    SELECT
        p.Nome_Produto, 
        p.Preco_produto, 
        p.TipoProduto,
        SUBSTRING(
            (SELECT distinct ',' + i.Nome_Ingrediente 
             FROM Ingrediente i 
             INNER JOIN ProdutoxIngrediente pri ON pri.ID_Ingrediente = i.ID_Ingrediente
             WHERE pri.ID_Produto = p.ID_Produto        
             FOR XML PATH('')), 2, 200000) AS Ingredientes 
    from Produto p
    where
        not exists
            (select 1 from Ingrediente i
             INNER JOIN ProdutoxIngrediente pri on pri.ID_Ingrediente = i.ID_Ingrediente
             where 
                 i.Nome_Ingrediente = @nome and
                 pri.ID_Produto = p.ID_Produto)

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    segunda-feira, 15 de julho de 2013 13:44
  • Deu Certo!

    Obrigado pela Ajuda!

    segunda-feira, 15 de julho de 2013 13:51
  • So me explica uma coisa

    o pq desse 1 no select do Not exists

    segunda-feira, 15 de julho de 2013 13:52
  • Legal que ajudou.

    Sobre o 1, basta a query que está dentro do Not Exists retornar qualquer valor (no caso o número 1 fixo) para que a condição não seja verdadeira.

    Abraço


    Assinatura: http://www.imoveisemexposicao.com.br

    segunda-feira, 15 de julho de 2013 14:01
  • putz cara....mals ae mas nao entendi direito...tem como explicar melhor???
    segunda-feira, 15 de julho de 2013 14:03
  • No exemplo acima, a subquery que está dentro do Exists vai retornar uma linha com uma coluna com o valor igual a 1 quando a pizza possui o ingrediente em questão, sendo que nesse caso o Exists retornará True. Basta a subquery retornar uma linha com qualquer valor para que o Exists retorne True, então foi utilizado o valor fixo 1, mas poderia ser utilizado qualquer valor, inclusive o valor de qualquer coluna.

    Quando a pizza não possue o ingrediente a subquery não vai retornar nenhuma linha, sendo que nesse caso o Exists retornará False.

    Com o Not antes do Exists teremos True quando a pizza não possue o ingrediente e False quando possue.

    Não sei se ficou mais claro agora...


    Assinatura: http://www.imoveisemexposicao.com.br

    segunda-feira, 15 de julho de 2013 14:30