SQL连接在一对多关系中,其中没有一个与给定值匹配

Jac*_*son 5 sql join one-to-many

说我有两张桌子

User
-----
id
first_name
last_name

User_Prefs
-----
user_id
pref
Run Code Online (Sandbox Code Playgroud)

User_Prefs中的示例数据可能是

user_id | pref
  2     |  SMS_NOTIFICATION
  2     |  EMAIL_OPT_OUT
  2     |  PINK_BACKGROUND_ON_FRIDAYS
Run Code Online (Sandbox Code Playgroud)

并且一些用户可能在User_Pref中没有对应的行.

我需要查询任何没有EMAIL_OPT_OUT的用户的名字和姓氏作为他们的(可能很多,可能没有)User_Pref行之一.

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

得到每个至少有一行不是"EMAIL_OPT_OUT"的人,这当然不是我想要的.我希望每个人都没有符合"EMAIL_OPT_OUT"的行.

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

May*_*ayo 11

我个人认为"where not exists"类型的子句可能更容易阅读,但这里是一个带有连接的查询,它做同样的事情.

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
Run Code Online (Sandbox Code Playgroud)

  • +1 这里要注意的重要一点是,您可以加入任何条件,并组合条件。您不限于加入匹配的键。 (2认同)