2014-02-11 5 views
1

Найдите сид, который зарезервировал красную и зеленую лодку.Использование и оператор с подзапросом

Table reserves 

sid bid 
22  101 
22  102 
22  103 
31  103 
32  104 

Table Boats 

Bid Color 
101 blue 
102 red 
103 green 
104 red 

Можно использовать и оператор с чем-то к югу от запроса, как этого

select sid from reserves where bid in 
(select bid from boats where color='red') and 
(select bid from boats where color='green') ; 

Здесь мне нужно проверить, присутствует ли в результатах как 1-го и 2-го подзапроса «ставка», а затем выберите sid.It не считает результат второго результата суб-запроса для меня.

ответ

1

Вы должны указать в бункере в отношении обоих subsqueries, а также вы бы и красные и зеленые лодки (и лодки могут быть только одного цвета), вы на самом деле говорите вы хотите, чтобы резервисты были либо красными, либо зелеными, поэтому OR здесь подходит.

select sid from reserves where 
bid in (select bid from boats where color='red') 
OR 
bid in (select bid from boats where color='green') ; 

Но более эффективный способ сделать это не с двух подзапросов, но с объединением:

SELECT sid FROM reserves AS r 
LEFT JOIN Boats as b ON r.bid = b.bid 
WHERE b.color IN ('red', 'green') 

Если вы хотите список содержит ориентировочное SIDs вы можете использовать одно из следующих действий:

SELECT distinct(sid) FROM reserves AS r 
LEFT JOIN Boats as b ON r.bid = b.bid 
WHERE b.color IN ('red', 'green') 

или

SELECT sid FROM reserves AS r 
LEFT JOIN Boats as b ON r.bid = b.bid 
WHERE b.color IN ('red', 'green') 
GROUP BY sid 

я имел неоднозначный опыт с эффективностью GROUP BY против DISTINCT на очень больших таблиц (40GB +)

UPDATE: Как я избегаю понял ваш предыдущий вопрос этот, может быть, более подходящее решение:

SELECT sid FROM reserves AS r 
LEFT JOIN Boats as b ON r.bid = b.bid 
GROUP BY sid 
HAVING sum(b.color = 'red') and sum(b.color= 'green') 

Здесь мы присоединяемся к таблицам, а затем группируем строки по SID. Используя предложение having, мы рассчитываем сумму булевых проверок на b.color = 'red' (и 'green'), сумма будет равна нулю, если у вас нет ставок лодок, которые являются красными (или зелеными), и, вместе вы знаете, что сумма красных> 1 и сумма (зеленая)> 1.

И sqlfiddle для вас, чтобы играть с: http://sqlfiddle.com/#!2/b5ec1/8

+0

приятно, это работает, если лодки содержат ставку более одного раза. Я сомневаюсь, что ОП означал это, но так как мы не знаем ... – luksch

+0

Это не работает :( – Yuvi

+0

Тогда, пожалуйста, переформулируйте вопрос и более подробно, чтобы мы могли понять ваши данные. – ModulusJoe

1

Попробуйте, как этот

SELECT sid 
FROM reserves 
WHERE bid IN 
(select bid FROM boats WHERE color IN ('red','green')) 

(Или)

SELECT sid 
FROM reserves 
WHERE bid IN 
(select bid FROM boats WHERE color = 'red' OR color = 'green') 
1

Я хотел бы написать

select sid from reserves where bid in 
(select bid from boats where color='red' OR color='green'); 
+0

Вопрос в том, как же с.и.д. должен иметь как красный и зеленый цвет, используя оператор ИЛИ делает его, как цвет может быть зеленым или красным. – Yuvi

0

Вы также могли бы рассмотреть этот подход (замена подзапрос с объединением):

SELECT sid 
FROM reserves 
JOIN boats ON 
reserves.bid = boats.bid 
AND boats.color IN ('red', 'green') 

Этот запрос возвращает все sid в резервы, которые имеют лодки с тем же bid с одним из указанных цветов.

1

Он работает что-то вроде этого

select sid from reserves where bid in(select bid from boats where color='red') 
and sid in 
(select sid from reserves where bid in(select bid from boats where color='green')); 
Смежные вопросы