【问题标题】:How can I exclude a row in a SQL select query that has a many to many relationship?如何在具有多对多关系的 SQL 选择查询中排除一行?
【发布时间】:2019-09-19 22:51:32
【问题描述】:

我有三个表,包括一个多对多连接表。

表 1:事件

+-------------------------+
| EventID | eventName     |
+-------------------------+
| 1       | Backyard BBQ  |
| 2       | Night Out     |
| 3       | Birthday Party|
+-------------------------+

表 2:事件类型

+-----------------------+
| typeID | typeName     |
+-----------------------+
| 1       | BBQ         |
| 2       | Happy Hour  |
| 3       | House Party |
+-----------------------+

表 3:event_type_join

+---------------------------+
| joinID | eventID | typeID |
+---------------------------+
| 1      | 1       | 1      |
| 2      | 1       | 3      |
| 2      | 2       | 2      |
| 3      | 3       | 3      |
+---------------------------+

如何编写 SQL 选择语句来获取所有没有 typeID = 3 -“家庭聚会”的事件?

注意:一个事件可以与多个事件类型相关联,因为 EventID 1 既是烧烤又是家庭聚会。

我正在寻找的结果只有“Night Out”事件。

随着我添加更多事件和事件类型,我希望能够一次限制多个事件类型。

我一直在使用不同的选择语句,但不知道如何删除或排除与其中一个联接有关系的行。

感谢您的帮助。

【问题讨论】:

    标签: sql database many-to-many


    【解决方案1】:

    NOT EXISTS 条件与相关子查询一起使用:

    SELECT e.*
    FROM events e
    WHERE NOT EXISTS (
        SELECT 1
        FROM event_type_join etj
        WHERE etj.typeID = 3 AND etj.eventID = e.eventID 
    )
    

    NOT EXISTS 条件确保当前事件与typeID = 3 的联结表中不存在任何记录。

    注意:由于您已经知道要避免的事件类型的typeID,因此您不需要在查询中涉及表event_type

    【讨论】:

    • 有效!棒极了。看起来我也不需要使用 GROUP BY。我以前从未见过 SELECT 1。而不是分组依据,它只是从查询中选择一个结果?谢谢!
    • @Will:欢迎! SELECT 1 只是一个丢弃结果的表达式。由于我们只想知道记录是否为EXISTS,因此我们不需要子查询结果中的任何列..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多