我如何仅选择唯一用户ID仅具有ACCESS_COLUMN_ID值1的用户,即使他们也可能也具有ACCESS_COLUMN_ID值2。
这是我的查询,返回1和2:
SELECT DISTINCT(USER_ID) FROM USER_ACCESS WHERE ACCESS_COLUMN_ID = 1
返回的结果还包含具有的用户ID ACCESS_COLUMN_ID = 2
。
Here is my table data
USERID ACCESS_COLUMN_ID
1 1
1 2
2 1
我期望USERID 2仅作为查询结果
您可以使用HAVING
:
SELECT USER_ID
FROM USER_ACCESS
GROUP BY USER_ID
HAVING MIN(ACCESS_COLUMN_ID) = 1
AND MAX(ACCESS_COLUMN_ID) = 1
user_id
由于该group by
子句,此查询将获取all ,但仅获取唯一的查询。然后,将采用access_column_id
为每个值找到的最小值和最大值,如果这两个值均为1,则将user_id
保留在最终结果集中。
上面的表将只引用一次,因此具有良好的性能。
为了您的利益,还有几种其他方法可获得相同的结果。但是,他们都需要将该表引用两次。您可能要自己比较它们的可读性和性能:
不存在
SELECT DISTINCT USER_ID
FROM USER_ACCESS UA1
WHERE UA1.ACCESS_COLUMN_ID = 1
AND NOT EXISTS (
SELECT 1
FROM USER_ACCESS UA2
WHERE UA1.USER_ID = UA2.USER_ID
AND UA2.ACCESS_COLUMN_ID <> 1)
不在
这与上一个非常相似,但是以我的经验并没有那么好:
SELECT DISTINCT USER_ID
FROM USER_ACCESS
WHERE ACCESS_COLUMN_ID = 1
AND USER_ID NOT IN (
SELECT USER_ID
FROM USER_ACCESS
WHERE ACCESS_COLUMN_ID <> 1)
外部自我加入
这通常比前两个解决方案具有更好的性能:
SELECT DISTINCT USER_ID
FROM USER_ACCESS UA1
LEFT JOIN USER_ACCESS UA2
ON UA1.USER_ID = UA2.USER_ID
AND UA2.ACCESS_COLUMN_ID <> 1
WHERE UA1.ACCESS_COLUMN_ID = 1
AND UA2.USER_ID IS NULL
最后一个NULL
条件检查外部联接没有产生任何匹配(与ACCESS_COMUN_ID <> 1
)。
除了
这是SQL Server特有的语法,但很容易理解(Oracle也有类似的语法MINUS
)。
SELECT DISTINCT USER_ID
FROM USER_ACCESS
WHERE ACCESS_COLUMN_ID = 1
EXCEPT
SELECT USER_ID
FROM USER_ACCESS
WHERE ACCESS_COLUMN_ID <> 1
备注DISTINCT
该DISTINCT
关键字是很容易理解,但人们可能经常用得到更好的性能GROUP BY
条款代替。这可以应用于上述所有解决方案。
如果可以肯定的是不能有两个记录与相同的价值观USER_ID
和ACCESS_COLUMN_ID
当时的DISTINCT
关键字可以在上面查询被排除在外。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句