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

时间:2013-07-04 11:59:40

标签: 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

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

所有行的页面的公共值

  1. 我希望从此表中为每个列“pro”提取公共列“页面”。 这就是我们的期望:

     1
     9
    

    我试图使用:

    SELECT DISTINCT a.page
    FROM a
    WHERE a.page IN (
      SELECT b.page FROM a as b
      WHERE b.pro <> a.pro
    ) 
    

    但是此查询会返回每个“页面”,其中至少一个常见值,而不是我们需要的值。见下文:

     1
     4
     9
    12
    

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

  2. 我希望提取链接到一个或多个“专业版”的“页面”,但并不是所有这些都是共同的(这与之前的查询完全相反)

  3. 以下是我们的期望:

      2
      3
      4
      5
     12
     13
     14
     15
    

    我无法找到这两个查询的解决方案:'( 那些人可以帮助我吗?

    祝你好运

    编辑:SQLfiddle网址

2 个答案:

答案 0 :(得分:6)

只是反思一点 - 按page分组,并为每个值计算不同的pro值。返回与不同pro

的总和匹配的行
SELECT [page]
FROM a
GROUP BY [page]
HAVING COUNT(DISTINCT pro) = (SELECT COUNT(DISTINCT pro) FROM a)

<强> SQLFiddle

编辑:对于第二个问题,只需将=替换为'&lt;'在最后一行 - &gt;的 SQLFiddle

答案 1 :(得分:1)

对于问题的第一部分,请尝试以下查询:

SELECT DISTINCT t1.page FROM a t1
WHERE (SELECT COUNT(DISTINCT t2.pro) FROM a t2 WHERE
       t2.page = t1.page) = 
(SELECT COUNT(DISTINCT t3.pro) FROM a t3)

第二个查询是所有页面值的简单减法:

SELECT DISTINCT t4.page FROM a t4
EXCEPT
SELECT DISTINCT t1.page FROM a t1
WHERE (SELECT COUNT(DISTINCT t2.pro) FROM a t2 WHERE
       t2.page = t1.page) = 
(SELECT COUNT(DISTINCT t3.pro) FROM a t3)