SQL where子句奇怪的行为

Mic*_*oya -6 sql t-sql sql-server

这是来自单个表的简单where子句.问题是我应该得到任何结果.AND是必要的,因为必须满足这两个条件.第二张表显示应满足条件.

select *
from UserPermissions up
where up.PermissionId = 5 and up.PermissionId = 7

select *
from UserPermissions up
where up.UserId = '40376a15-8b4b-43c0-a174-67f935ec7e8e'
Run Code Online (Sandbox Code Playgroud)

结果如下.第一个查询不返回任何结果,但选择2显示特定用户的结果.第2行和第3行显示PermissionId应该匹配.

在此输入图像描述

对我所问的内容似乎存在一些误解.最有可能是措辞如何.我很期待是得到谁拥有每个用户一个用户名的5(一行)和7 PermissionID(另一行).

Tar*_*ryn 7

您的原始查询的问题是您要求返回PermissionId同时等于两个值的结果- 意味着同一行 - 这是不可能的.

但是,您可以通过使用with 子句返回UserID具有PermissionId =5 AND PermissionId =7的两个:GROUP BYHAVING

SELECT userId
FROM UserPermissions up
WHERE PermissionId IN (5, 7)
GROUP BY userId
HAVING COUNT(DISTINCT PermissionId) = 2
Run Code Online (Sandbox Code Playgroud)

  • 当您检查具有3或7或15权限的人时,它确实可以更好地扩展(在代码和性能方面)... (2认同)

Zan*_*ane 5

好吧OP这样做对你有什么用吗?

select
    a.UserId
from UserPermissions as a
inner join userpermissions as b
    on a.userID = b.userID
    and a.permissionID = 5
    and b.permissionID = 7
Run Code Online (Sandbox Code Playgroud)