2

私はテーブルを持っています:

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. このテーブルから各列「プロ」の共通列「ページ」を抽出しようとしています。ここに私たちが期待するものがあります:

     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 つ持つすべての「ページ」を返します。下記参照 :

     1
     4
     9
    12
    

    反対のクエリは、常にではなく、少なくとも 1 つは異なる値です。

  2. 1 つ以上の「プロ」にリンクされているが、それらすべてに共通ではない「ページ」を抽出しようとしています (前のクエリとは正反対です)。

これが私たちが期待するものです:

  2
  3
  4
  5
 12
 13
 14
 15

これらの 2 つのクエリの解決策を見つけることができません :'( 誰か助けてくれませんか?

よろしくお願いします

編集: SQLfiddle の URL

4

2 に答える 2

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)

2 番目のクエリは、すべてのページの値からの単純な減算です。

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)
于 2013-07-04T12:05:13.387 に答える