2014-12-09 3 views
0

Я работаю над своей работой SQL для следующего. Я могу написать запрос для следующего использования «И», но я могу придумать «по крайней мере» в запросе.Использование, по крайней мере, в запросе SQL

Найти поставщиков поставщиков, которые поставляют красную часть и зеленую часть.

Select s.sid from suppliers s, catalog c, parts p 
where s.sid=c.sid and c.pid=p.pid and p.color='Red' 
intersect 
Select s.sid from suppliers s, catalog c, parts p 
where s.sid=c.sid and c.pid=p.pid and p.color='Green'; 

Как написать запрос с помощью atleast на вопрос, как

«Найти МОРГ поставщиков, которые поставляют по крайней мере, две красные части и, по меньшей мере, две зеленые части.»

ответ

0

Попробуйте это:

select sid from 
(select 
s.sid sid, 
sum(case when p.color = 'Red' then 1 else 0 end) as red, 
sum(case when p.color = 'Green' then 1 else 0 end) as green 
from suppliers s 
left join catalog c on s.sid = c.sid 
left join parts p on p.pid = c.pid 
group by s.sid) s 
where 
green >= 2 and red >= 2 

Идея заключается в том, чтобы создать список поставщиков с отсчетами, сколько красных и зеленых частей они поставляют, а затем фильтрации пороговыми значениями.

SQLFiddle

+0

Спасибо за помощь! – Dvlop

3

Я лично избежать запроса, который использует подзапрос, как в первом ответе. Вот решение, которое использует один запрос с предложением GROUP BY и HAVING. Вы просто подсчитываете красный и зеленый цвет и фильтруете в HAVING поставщиками, у которых есть статистика, которую вы хотите. Обратите внимание, что подключение к таблице поставщиков необязательно.

SELECT 
    c.sid, 
    SUM(CASE WHEN p.color='Red' THEN 1 ELSE 0 END) AS redCt, 
    SUM(CASE WHEN p.color='Green' THEN 1 ELSE 0 END) AS greenCt 
FROM 
catalog c 
JOIN parts p ON c.pid = p.pid 
GROUP BY c.sid 
HAVING redCt >= 2 AND greenCt >= 2 

http://sqlfiddle.com/#!2/85e8c1/14

+0

Этот запрос является красноречивым. Хорошая работа – zedfoxus

+0

Причина, по которой я избегал этого, заключается в том, что он не переносится. Например, запрос не будет выполняться в MS SQL. –

+0

Правда, хотя он именовал его как MySQL. –

0

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

SELECT * FROM ( Select s.sid, ROW_NUMBER() OVER (PARTITION BY p.color ORDER BY s.sid DESC) ROWNUM от поставщиков s внутренний каталог присоединения c по s.sid = c.sid ВНУТРЕННИЙ JOIN детали p ON c.pid = p.pid где p.color = 'красный' или p.color = 'зеленый' ) T4 WHERE ROWNUM> = 2

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