代码之家  ›  专栏  ›  技术社区  ›  Jacob Mattison

一对多关系上的SQL联接,其中多个关系中没有一个与给定值匹配

  •  5
  • Jacob Mattison  · 技术社区  · 14 年前

    User
    -----
    id
    first_name
    last_name
    
    User_Prefs
    -----
    user_id
    pref
    

    用户首选项中的示例数据可能是

    user_id | pref
      2     |  SMS_NOTIFICATION
      2     |  EMAIL_OPT_OUT
      2     |  PINK_BACKGROUND_ON_FRIDAYS
    

    某些用户可能在用户首选项中没有相应的行。

    SELECT DISTINCT u.* from User u
    LEFT JOIN User_Prefs up ON (u.id=up.user_id)
    WHERE up.pref<>'EMAIL_OPT_OUT'
    

    告诉我所有至少有一行不是“EMAIL\u OPT\u OUT”的人,这当然不是我想要的。我希望所有没有匹配“EMAIL\u OPT\u OUT”的行的人。

    有没有办法让连接类型和连接条件过滤掉我想留在这里的行?或者我需要一个子查询?

    2 回复  |  直到 14 年前
        1
  •  12
  •   Mayo    14 年前

    我个人认为“where not exists”类型的子句可能更容易阅读,但这里有一个带有join的查询也做同样的事情。

    select distinct u.* from User u
    left join User_Prefs up ON u.id = up.user_id and up.pref = 'EMAIL_OPT_OUT'
    where up.user_id is null
    
        2
  •  0
  •   Marcus Adams    14 年前

    为什么不将用户首选项作为布尔字段存储在用户表中?这将大大简化您的查询。

    SELECT * FROM User WHERE EMAIL_OPT_OUT = false