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