获取具有列值约束的记录

时间:2010-12-16 08:49:38

标签: sql-server-2005

我有一张像

这样的表
    Name              Privilege                                                           
     x                   1                                                                
     y                   2                                                                
     x                   3                                                                
     A                   1                                                                

现在我只想获取仅拥有权限1的名称。 即,重新应该是,

    Name           Privilege                                                           
     A                1             

有人可以帮我这个吗?

2 个答案:

答案 0 :(得分:0)

SELECT
    *
FROM
    <table> t
         LEFT JOIN
    <table> t2
         ON
             t.Name = t2.Name and
             t2.Privilege <> 1
WHERE
    t2.Name is null and
    t.Privilige = 1

或者您也可以将其写为NOT EXISTS子句和相关子查询。


修改

从评论中,你想要找到“匹配这个集合,只有这个集合” - 将你的条件放在另一个表(可能是临时表或表变量)中,然后开始查看“关系分区”。谷歌搜索这个术语会带来Joe Celko article,这是一个不错的阅读。 “确切分区”下的例子就是你所说的那种。

答案 1 :(得分:0)

;WITH set1 AS (SELECT * FROM Privileges WHERE Privilege IN (1, 3))
SELECT up.UserId
FROM UserPrivileges up
INNER JOIN set1 ON set1.Privilege = set1.Privilege
GROUP BY up.UserId
HAVING COUNT(up.Privilege) = (SELECT COUNT(*) FROM set1);