2013-01-12 21 views
4

我有兩個表。而我需要的所有organizer_id s表示2010年和2012年SQL SELECT:我需要一個「IN ALL」子句

event 
--------- 
event_id 
name 
year 


event_organizer 
--------- 
event_id 
organizer_id 

我想這樣的事情之間舉辦的所有活動:

SELECT organizer_id 
    FROM event_organizer 
WHERE event_id IN (SELECT event_id 
         FROM event 
        WHERE year>=2010 AND year<=2012); 

但它沒有工作,因爲我只需要已舉辦了organizer_id所有事件2010年和2012年之間。我不知道如何查詢應該看起來像它的工作,因爲我想。

+0

嘗試'event'反引號內 –

回答

8

你可以寫:

SELECT t1.organizer_id 
    FROM (SELECT eo.organizer_id, 
       COUNT(1) AS num_events 
      FROM event_organizer eo 
      JOIN event e 
      ON eo.event_id = e.event_id 
      WHERE e.year BETWEEN 2010 AND 2012 
      GROUP 
      BY eo.organizer_id 
     ) t1 
    JOIN (SELECT COUNT(1) AS num_events 
      FROM event e 
      WHERE e.year BETWEEN 2010 AND 2012 
     ) t2 
    ON t1.num_events = t2.num_events 
; 

(對於上述的想法是:每個管理器,發現他2010年和2012年之間有多少事件(S)主辦然後,比較這對總數2010年和2012年之間的事件。如果這兩個數字相同,則主辦機構在該時間段內的所有事件)

或者,你可以寫:

SELECT organizer_id 
    FROM organizer  -- I assume you have an 'organizer' table? 
WHERE organizer_id NOT IN 
     (SELECT o.organizer_id 
      FROM event e 
      CROSS 
      JOIN organizer o 
      LEFT 
      OUTER 
      JOIN event_organizer eo 
       ON e.event_id = eo.event_id 
      AND o.organizer_id = eo.organizer_id 
      WHERE e.year BETWEEN 2010 and 2012 
      AND eo.event_id IS NULL 
     ) 
; 

(IDE中a爲這一個是:找到所有事件–組織者配對,使組織者配對而不是組織者事件。然後,返回誰不會出現在任何這樣的配對所有組織者)

4

我覺得做這樣的查詢最簡單的方法是用聚合:

with events as (
    select event_id 
    FROM event 
    WHERE year>=2010 AND year<=2012 
) 
select organizer_id 
from event_organizer eo 
where event_id in (select event_id from events) 
group by organizer_id 
having count(distinct event_id) = (select count(*) from events)