【问题标题】:SQL Server Intersection of Records from Single Table来自单个表的 SQL Server 记录交集
【发布时间】:2019-08-27 16:20:56
【问题描述】:

我有下表:

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

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

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

最有效的方法是什么?

【问题讨论】:

    标签: sql-server sql-server-2008-r2 intersect


    【解决方案1】:

    一个选项是连接后跟一个聚合:

    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 子句就是处理这个问题的原因。

    【讨论】:

    • 谢谢!这正是我所需要的。也非常感谢那个演示解释。很有道理!!!
    猜你喜欢
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-25
    • 1970-01-01
    相关资源
    最近更新 更多