SQL 来自单个 Table 的服务器记录交集

SQL Server Intersection of Records from Single Table

我有以下 table:

|  TheaterID  |   MovieID   |
|-------------|-------------|
|     1001    |     201     |
|     1001    |     202     |
|     1001    |     203     |
|     1001    |     206     |
|     1006    |     201     |
|     1006    |     203     |
|     1006    |     206     |
|     1011    |     201     |
|     1011    |     203     |
|     1011    |     204     |
|     1011    |     206     |
|     1039    |     201     |
|     1039    |     202     |
|     1039    |     203     |
|     1039    |     204     |
|     1039    |     206     |

我有一个列表,其中包含 TheaterID 的以下记录:

|  TheaterID  |
|-------------|
|     1001    |
|     1006    |
|     1008    |
|     1011    |
|     1039    |

我正在尝试从主 table 中获取包含 MovieID 交集的单个列表。

|   MovieID   |
|-------------|
|     201     |
|     203     |
|     206     |

最有效的方法是什么?

一个选项是先连接再聚合:

SELECT m.MovieID
FROM Movies m
INNER JOIN Theaters t
    ON m.TheaterID = t.TheaterID
GROUP BY
    m.MovieID
HAVING
    COUNT(*) = (SELECT COUNT(DISTINCT t.TheaterID)
                FROM Theaters t INNER JOIN Movies m
                    ON t.TheaterID = m.TheaterID);

Demo

这里的策略是聚合每部电影并断言其计数(应该是影院的数量)与两个表之间重叠的影院总数相匹配。看起来有点复杂的 HAVING 子句就是处理这个问题的原因。