我有一张桌子:
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和我开始编写的查询)
我希望从此表中为每个列“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
4
5
12
13
14
15
我无法找到这两个查询的解决方案:'( 那些人可以帮助我吗?
祝你好运
编辑:SQLfiddle网址
答案 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)