1

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

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

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

当然,这将显示所有具有三个所列站点中的任何一个的条目的不同用户。我只想要对所有三个列出的站点都有条目的用户。

我觉得可能有一种明显的方法可以做到这一点,一旦有人指出,我可能会觉得很愚蠢。尽管如此,我还是在画一个空白。

4

2 回答 2

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

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

一种更加动态的方法,其中站点只指定一次并且 c​​ount() 自动调整可能是这样的:

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)

于 2012-06-20T14:00:38.693 回答
0

这应该适用于大多数 DBMS:

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

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

于 2012-06-20T14:09:16.970 回答