如何用T-SQL查询满足特定多组设置条件的用户?
正确的T-SQL实现方案
你的原SQL逻辑错误在于要求同一条Settings记录同时满足两个互斥的settingKey条件,这显然不可能匹配到任何数据。以下是几种可行的实现方式:
方法1:两次内连接Settings表
通过两次连接Settings表,分别匹配两个设置条件,确保用户同时拥有这两条有效记录:
SELECT u.* FROM [User] u INNER JOIN Settings s1 ON u.userId = s1.userId INNER JOIN Settings s2 ON u.userId = s2.userId WHERE s1.settingKey = 'allowClient' AND s1.settingValue = '0' AND s2.settingKey = 'allowAccess' AND s2.settingValue = '1'
方法2:GROUP BY + HAVING筛选
先筛选出符合任一条件的记录,再按用户分组,确保分组内同时包含两个目标设置:
SELECT u.* FROM [User] u INNER JOIN Settings s ON u.userId = s.userId WHERE (s.settingKey = 'allowClient' AND s.settingValue = '0') OR (s.settingKey = 'allowAccess' AND s.settingValue = '1') GROUP BY u.userId, u.userName -- 需包含User表所有要查询的非聚合字段 HAVING COUNT(DISTINCT s.settingKey) = 2
注意:如果User表字段较多,此方法需要在GROUP BY中列出所有查询字段,相对繁琐。
方法3:EXISTS子查询
通过两次子查询检查用户是否同时存在两个符合条件的设置记录,逻辑直观且无需处理分组字段:
SELECT u.* FROM [User] u WHERE EXISTS ( SELECT 1 FROM Settings s WHERE s.userId = u.userId AND s.settingKey = 'allowClient' AND s.settingValue = '0' ) AND EXISTS ( SELECT 1 FROM Settings s WHERE s.userId = u.userId AND s.settingKey = 'allowAccess' AND s.settingValue = '1' )
内容的提问来源于stack exchange,提问作者Riz
相关产品推荐
相关产品推荐

