SQL SELECT:我需要一个"IN ALL"子句

use*_*968 4 sql oracle select

我有两张桌子.而且我需要organizer_id在2010年到2012年之间组织所有活动的所有活动.

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


event_organizer
---------
event_id
organizer_id
Run Code Online (Sandbox Code Playgroud)

我试过这样的事情:

SELECT organizer_id 
  FROM event_organizer
 WHERE event_id IN (SELECT event_id 
                      FROM event 
                     WHERE year>=2010 AND year<=2012);
Run Code Online (Sandbox Code Playgroud)

但它不起作用,因为我只需要organizer_id在2010年和2012年之间组织所有事件.我不知道查询应该如何按照我的意愿运行.

rua*_*akh 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
;
Run Code Online (Sandbox Code Playgroud)

(上述想法是:对于每个组织者,找出他在2010年和2012年之间组织的事件数量.然后,将其与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
        )
;
Run Code Online (Sandbox Code Playgroud)

(这一个想法是:找到所有事件的组织者配对使得组织者并没有组织活动之后,回到谁不会出现在任何这样的配对所有的组织者.)