有没有更好的方法来编写此查询?

Sup*_*NES 2 sql t-sql sql-server-2008

所以,假设我正在尝试获取属于某个用户组的所有用户的列表.简单:

SELECT *
  FROM users, usergroups
 WHERE usergroups.user_group_id = 1
Run Code Online (Sandbox Code Playgroud)

现在,假设我想获得属于特定用户组的所有用户的列表,以及以.edu结尾的电子邮件.

SELECT *
  FROM users, usergroups
 WHERE usergroups.user_group_id = 1
   AND users.email LIKE '%.edu'
Run Code Online (Sandbox Code Playgroud)

这很好用.现在假设我们想要获得上述所有内容以及属于用户组2的用户 - 但我们并不关心第二组的电子邮件地址.此查询不起作用:

SELECT *
  FROM users, usergroups
 WHERE usergroups.user_group_id IN (1,2)
   AND users.email LIKE '%.edu'
Run Code Online (Sandbox Code Playgroud)

因为它会过滤第二组中的用户.现在我正在做这样的事情:

SELECT *
  FROM users as usrs, usergroups as groups1, usergroups as groups2
 WHERE (groups1s.user_group_id = 1 AND users.email LIKE '%.edu')
    OR groups2.user_group_id = 2
Run Code Online (Sandbox Code Playgroud)

这给了我想要的结果,但我讨厌它看起来和工作的方式.有更清洁的方法吗?

编辑

我没有在上一次迭代中包含连接.这是查询应该是什么样子:

SELECT *
FROM users as usrs JOIN
usergroups as groups1 on usrs.group_id = groups1.group_id JOIN
usergroups as groups2 on usrs.group_id = groups2.group_id
WHERE (groups1.user_group_id = 1 AND users.email LIKE '%.edu')
OR groups2.user_group_id = 2
Run Code Online (Sandbox Code Playgroud)

dse*_*ton 5

不需要使用不同的别名选择两次用户组.你可以做到:


SELECT *
  FROM users as usrs, usergroups
 WHERE (usergroups.user_group_id = 1 AND users.email LIKE '%.edu')
    OR usergroups.user_group_id = 2
Run Code Online (Sandbox Code Playgroud)

或者,甚至更好(使用连接):


SELECT *
  FROM users as usrs 
  JOIN usergroups on usergroups.userid = users.id
 WHERE (usergroups.user_group_id = 1 AND users.email LIKE '%.edu')
    OR usergroups.user_group_id = 2
Run Code Online (Sandbox Code Playgroud)