2015-03-25 3 views
0

Я пытаюсь выполнить некоторые запросы, которые мне нужно выполнить для задания, и меня застряли, и я исследовал множество способов сделать это, но никуда не денусь.SQL - Если и только

Вопрос, который я пытаюсь выполнить, - это;

«Список всех пиццы с начинкой Олив и пепперони»

Это не просит все пиццы с оливковым и всех пиццы с пепперони, но и.

Мне удалось отобрать его, чтобы перечислить все пиццы, которые есть, однако, если я запишу там И, он просто объединяет идентификаторы вместе.

Вот мои таблицы;

ToppingID ToppingDesc 
    20  Cheese 
    21  Tomato 
    22  Pepperoni 
    23  Ground-Beef 
    24  Meatballs 
    25  Chicken 
    26  Peppers 
    27  Onion 
    28  Mushroom 
    29  Ham 
    30  Pineapple 
    31  Olives 
    32  Anchovies 
    33  Sweetcorn 

Так здесь вы можете увидеть, что Пепперони 22, Маслины 31

PizzaID  ToppingID 
    90   22 
    92   31 
    95   22 
    95   31 
    96   31 
    98   31 

Здесь мы видим, что 95 происходит дважды потому что содержит как.

PizzaID  CrustID 
    90   801 
    92   802 
    95   801 
    96   801 
    98   802 

С моим даным Я бы идеально, как это будет отображаться

PizzaID  ToppingID 
    95   22 
    95   31 

Но из всех запросов, я бег, я просто получить результат в таблице выше отображение всех пиццы с любым из них ,

Можно ли его отобразить только и на одной пицце? Когда я использую a, и он ищет ToppingID '3122'.

Любая помощь была бы принята с благодарностью

Спасибо!

+0

Не могли бы вы показать свои определения таблиц и какие запросы вы пробовали? – Schwern

+0

Кроме того, что RDBMS? Вероятно, это дубликат любого числа вопросов, но ответы могут зависеть от используемой вами базы данных. – LittleBobbyTables

ответ

2

Вы можете использовать EXISTS:

SELECT * 
FROM Pizzas p 
WHERE EXISTS 
    (SELECT PizzaID FROM PizzaToppings WHERE ToppingID = 22 AND PizzaID = p.PizzaID) 
    AND EXISTS 
    (SELECT PizzaID FROM PizzaToppings WHERE ToppingID = 31 AND PizzaID = p.PizzaID) 
+0

Я не знаю, если я тупой? Но когда я использовал это, я получил ошибку; Msg 208, уровень 16, состояние 1, строка 1 Недопустимое имя объекта 'Pizzas'. –

+0

Ну, вы не указали имена своих таблиц, поэтому я догадался. –

+0

Неплохо, я добавил правильные имена таблиц, и это сработало! Спасибо :) –

1

Вот два способа сделать это, которые должны работать в большинстве баз данных.

Как вы забыли упомянуть, что назвали ваши таблицы, я использую имя PizzaToppings для таблицы соединений между пиццей и начинкой.

select * from PizzaToppings 
where PizzaID in (
    select PizzaID from PizzaToppings where ToppingID = 22 
    intersect -- this is sometimes known by other names 
    select PizzaID from PizzaToppings where ToppingID = 31 
) 

select * from PizzaToppings 
where PizzaID in (
    select PizzaID from PizzaToppings where ToppingID in (22,31) 
    group by PizzaID having COUNT(ToppingID) = 2 
) 
+1

Мне нравится первое решение. Моя единственная проблема со вторым решением заключается в том, что вы можете получить ложные срабатывания, если у пиццы есть две начинки Пепперони. Там могут быть правила целостности данных, чтобы предотвратить это, но в целом я не люблю полагаться на подсчеты, чтобы соответствовать нескольким критериям. –

+0

@ DStanley Да, я не особенно люблю решение count - либо пересекается, просто кажется намного яснее. – jpw

+1

Хотя 'INTERSECT' не является стандартным SQL, поэтому он может не работать на всех системах. –

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