SQL:在所有站点列表中选择包含条目的用户

时间:2012-06-20 13:59:08

标签: sql distinct

如果我有一个包含table1.user和table1.site列的table1,我该如何返回有权访问所有站点列表的不同用户列表?

让我澄清一下。我可以从以下代码开始:

    SELECT  DISTINCT user
    FROM    table1
    WHERE   (site IN ('site1','site2','site3'))

当然,这将显示所有具有三个列出网站中任何一个的条目的不同用户。我只希望有三个列出网站的所有人都有条目的用户。

我觉得可能有一种明显的方法可以做到这一点,而且一旦有人指出它,我可能会感到非常愚蠢。不过,我正在画一个空白。

2 个答案:

答案 0 :(得分:2)

SELECT  user
FROM    table1
WHERE   site IN ('site1','site2','site3')
GROUP BY user
HAVING count(*) = 3

这假定用户不能多次分配到同一站点。如果情况并非如此,那么Gordon的评论是正确的,并且表达式必须替换为HAVING count(distinct site) = 3

一种更具动态性的方法,其中网站仅指定一次并且count()自动调整可能是这样的:

WITH sites (site_name) AS (
   VALUES ('site1'), 
          ('site2'),
          ('site3')
)
SELECT  user
FROM    table1
WHERE   site IN (SELECT site_name FROM sites) 
GROUP BY user
HAVING count(*) = (select count(*) from sites);

(这是ANSI SQL,因为没有指定DBMS)

答案 1 :(得分:0)

这应该适用于大多数DBMS:

select user from table1
where site in ('site1', 'site2', 'site3')
group by user
having count(distinct site) = 3

请注意,您必须将网站数量(本例中为3)与in子句中列出的网站数量相匹配。