2013-09-16 2 views
0

Я пытаюсь найти запрос, который исключает определенные записи, которые имеют определенное значение. Вот отрывок из моего кода:Выбор только записей, где определенные данные не существуют

CREATE TABLE #myMenu 
    ([Id] int, [dish] varchar(100), [dishtype] varchar(10), [amount] int, [ingredient]  varchar(10)) 
; 

INSERT INTO #myMenu 
    ([Id], [dish], [dishtype], [amount], [ingredient]) 
VALUES 
    (1, 'salad', 'appetizer', 1, 'nuts'), 
    (1, 'salad', 'appetizer', 1, 'lettuce'), 
    (2, 'chicken cashew nuts', 'main', 2, 'chicken'), 
    (2, 'chicken cashew nuts', 'main', 9, 'nuts'), 
    (3, 'chicken marsala', 'main', 0, 'chicken'), 
    (3, 'chicken marsala', 'main', 0, 'pepper'), 
    (4, 'roast pork macadamia', 'main', 2, 'nuts'), 
    (4, 'roast pork macadamia', 'main', 2, 'pork') 
; 

Теперь то, что я хочу сделать, это выбрать все блюда, которые не имеют орехов. Что должно быть только:

(3, 'chicken marsala', 'main' 
+0

Откуда вы знаете, есть ли что-то орехи? Это просто таблица ингредиентов? – Greg

ответ

1
select M.Id, M.Dish, M.DishType 
    from #myMenu as M inner join 
    (select Id, Sum(case when Ingredient = 'nuts' then 1 end) as Nutty from #MyMenu group by Id) as Nuts 
    on Nuts.Id = M.Id and Nuts.Nutty is NULL 
    group by M.Id, M.dish, M.dishtype 

или:

select distinct M.Id, M.Dish, M.DishType 
    from #myMenu as M inner join 
    (select Id, Sum(case when Ingredient = 'nuts' then 1 end) as Nutty from #MyMenu group by Id) as Nuts 
    on Nuts.Id = M.Id and Nuts.Nutty is NULL 
0
Select * 
FROM myMenu 
WHERE ingredient != 'nuts' AND 
dish NOT LIKE '%macadamia%' AND 
dish NOT LIKE '%cashew%' 

Если вы хотите включить только основные блюда, вы можете просто добавить и dishType = 'главный'

+0

Когда я попробую ваш запрос, я получаю несколько строк: http://sqlfiddle.com/#!6/23359/1 – dcaswell

+0

Вы должны получить две строки. Это потому, что у вас есть две строки, которые не имеют орехов. Курица Марсала с курицей и курицей Марсала с перцем. Если вам просто нужно одно имя чата, вы можете использовать SELECT DISTINCT вместо SELECT *. Это только даст вам название блюда. –

+1

Не вставляйте в запрос имена жестких дисков. Кроме того, правильные результаты находятся в вопросе: '(3, 'chicken marsala', 'main'' – dcaswell

2

The код ниже, но таблица, которую вы указали, должна быть нормализована и разбита на более, чем одна таблица.

select [Id],[dish],[dishtype] 
from #myMenu 
group by [Id],[dish],[dishtype] 
having sum(Case When ingredient='nuts' Then 1 Else 0 End)=0 
+0

Представленная мной таблица представляет собой совокупность нескольких таблиц. Это упрощенная форма. –

Смежные вопросы