Вы должны указать в бункере в отношении обоих 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
приятно, это работает, если лодки содержат ставку более одного раза. Я сомневаюсь, что ОП означал это, но так как мы не знаем ... – luksch
Это не работает :( – Yuvi
Тогда, пожалуйста, переформулируйте вопрос и более подробно, чтобы мы могли понять ваши данные. – ModulusJoe