SQL:如何在多个列上选择一个表的公共行

ToX*_*inE 2 sql sql-server sql-server-2000 rows

我有一张桌子:

create table a (page int, pro int)
go
insert into a select 1, 2
insert into a select 4, 2
insert into a select 5, 2
insert into a select 9, 2
insert into a select 1, 3
insert into a select 2, 3
insert into a select 3, 3
insert into a select 4, 3
insert into a select 9, 3
insert into a select 1, 4
insert into a select 9, 4
insert into a select 12, 4
insert into a select 1, 5
insert into a select 9, 5
insert into a select 12, 5
insert into a select 13, 5
insert into a select 14, 5
insert into a select 15, 5
go
Run Code Online (Sandbox Code Playgroud)

(这是我开始写的这个表的SQLfiddle和查询)

所有行的页面的公共值

  1. 我想从这个表中为每个列"pro" 提取公共列 "页面".这是我们所期望的:

     1
     9
    
    Run Code Online (Sandbox Code Playgroud)

    我试着用:

    SELECT DISTINCT a.page
    FROM a
    WHERE a.page IN (
      SELECT b.page FROM a as b
      WHERE b.pro <> a.pro
    ) 
    
    Run Code Online (Sandbox Code Playgroud)

    但是这个查询返回的每个"页面" 至少有一个不是我们需要的公共值.见下文 :

     1
     4
     9
    12
    
    Run Code Online (Sandbox Code Playgroud)

    相反的查询也称为至少一个但不是所有时间的不同值

  2. 我想要提取链接到一个或多个"专业人士"的"页面",但不是所有人共同的(这与前一个查询完全相反)

这是我们所期望的:

  2
  3
  4
  5
 12
 13
 14
 15
Run Code Online (Sandbox Code Playgroud)

我无法找到解决这两个问题的解决方案:'(有人可以帮我解决这些问题吗?

最好的祝福

编辑:SQLfiddle网址

Nen*_*vic 6

只是有点反向思考 - 分组page并计算pro每个的不同值.返回与不同pro值的总和匹配的行

SELECT [page]
FROM a
GROUP BY [page]
HAVING COUNT(DISTINCT pro) = (SELECT COUNT(DISTINCT pro) FROM a)
Run Code Online (Sandbox Code Playgroud)

SQLFiddle

编辑:对于第二个问题,只需=在最后一行中用'<' 替换- > SQLFiddle