SQL: comment sélectionner les lignes communes d'une table sur plusieurs colonnes

J'ai une table

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 

(voici le SQLfiddle de cette table et les requêtes j'ai commencé à écrire)

Valeur commune de la page sur TOUTES les lignes

  1. Je cherche à extraire la colonne commune "page" pour chaque colonne "pro" de cette table. Voici ce que nous attendons:

      1 9 

    J'ai essayé d'utiliser:

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

    mais cette requête renvoie toutes les "pages" qui ont au less une valeur commune, ce qui n'est pas ce dont nous avons besoin. voir ci-dessous :

      1 4 9 12 

    La requête opposée alias valeur différente au less un mais pas tout le time

  2. Je cherche à extraire la "page" liée à un ou plusieurs "pro" mais sans être commune à tous (c'est l'exact opposé de la requête précédente)

Voici ce que nous attendons:

  2 3 4 5 12 13 14 15 

Je n'arrive pas à find une solution à ces 2 questions: '(Quelqu'un pourrait-il m'aider sur ces questions?

Meilleures salutations

edit: l'URL SQLfiddle

Juste un peu de reflection inversée – groupe par page et count des valeurs pro distinctes pour chacun. Renvoie des lignes qui correspondent au total des valeurs pro distinctes

 SELECT [page] FROM a GROUP BY [page] HAVING COUNT(DISTINCT pro) = (SELECT COUNT(DISTINCT pro) FROM a) 

SQLFiddle

EDIT: pour le second problème, il suffit de replace = avec '<' dans la dernière ligne -> SQLFiddle

Fot la première partie de la question, essayez cette requête:

 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) 

Et la deuxième requête est la soustraction simple de toutes les valeurs de page:

 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)