SQL 选择 : I need a "IN ALL" Clause

标签 sql oracle select

我有两张 table 。我需要所有 organizer_id s 组织了 2010 年至 2012 年间的所有事件。

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 年之间的所有事件。我不知道查询应该如何像我想要的那样工作。

最佳答案

你可以写:

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 年之间组织了多少事件。然后,将其与 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
        )
;

(这个想法是:找到所有事件组织者配对,使得组织者没有组织事件。然后,返回所有没有出现在任何此类配对中的组织者。)

关于SQL 选择 : I need a "IN ALL" Clause,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14297354/

相关文章:

sql 查询结果到 databricks 笔记本中的 pandas df

c# - LINQ 的嵌套组

mysql - 如何在连接表时选择 1 行

oracle - 从 Oracle 版本获取编号

mysql - 根据mysql表中的日期和另一列值获取单行

mysql - 无法在 SQL 中显示正确的列表

c# - 与客户端应用程序打包的最佳数据库

sql - Rails ActiveRecord 和数据库规范化

java - 从oracle数据库获取数据时浏览器中504网关超时

oracle - 如何在 SQL 中以不同的增量循环遍历数字