如果我有一个包含table1.user和table1.site列的table1,我该如何返回有权访问所有站点列表的不同用户列表?
让我澄清一下。我可以从以下代码开始:
SELECT DISTINCT user
FROM table1
WHERE (site IN ('site1','site2','site3'))
当然,这将显示所有具有三个列出网站中任何一个的条目的不同用户。我只希望有三个列出网站的所有人都有条目的用户。
我觉得可能有一种明显的方法可以做到这一点,而且一旦有人指出它,我可能会感到非常愚蠢。不过,我正在画一个空白。
答案 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
子句中列出的网站数量相匹配。