sqlselect:我需要一个“IN-ALL”子句

sqlselect:我需要一个“IN-ALL”子句,sql,oracle,select,Sql,Oracle,Select,我有两张桌子。我需要所有2010年至2012年期间组织所有活动的组织者ID 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

我有两张桌子。我需要所有2010年至2012年期间组织所有活动的组织者ID

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);
但它不起作用,因为我只需要组织者的id,他们在2010年至2012年期间组织了所有活动。我不知道查询应该是什么样子,它可以按照我想要的方式工作

你可以写:

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
;
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
        )
;
上面的想法是:对于每个组织者,找出她在2010年到2012年间组织了多少活动。然后,将其与2010年至2012年间的事件总数进行比较。如果这两个数字相同,则组织者组织了该时间段内的所有活动

或者,您可以写:

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
;
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
        )
;

这种方法的思想是:找到所有事件-组织者配对,这样组织者就不会组织事件。然后,返回所有未出现在任何此类配对中的组织者。

我认为进行此类查询的最简单方法是使用聚合:

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)
在backtick中尝试事件