书籍搜索的SQL查询

时间:2016-03-02 13:19:58

标签: sql

我在一本书中有一张包含所有单词位置的表格 这个表是这样的

Word  PageNo  Position
----------------------
 A       1       10
 A       1       15
 B       1       13
 B       2       18
 C       2       20

我想找到包含单词A和单词B的页面
结果是第1页

我可以通过此查询获得答案

select PageNo from
 (select * from t where word = 'A') a inner join
 (select * from t where word = 'B') b on a.PageNo = b.PageNo

但我真正想要的是这个

Word  PageNo  Position
----------------------
 A       1       10
 A       1       15
 B       1       13

我想要所有具有pageno =的行(具有A和B的页面)

如果我使用此查询

select * from
 (select * from t where word = 'A') a inner join
 (select * from t where word = 'B') b on a.PageNo = b.PageNo

这是结果

Word  PageNo  Position   Word  PageNo  Position
------------------------------------------------------
 A       1       10       B       1       13
 A       1       15       B       1       13

当我加入两个列表并选择所有列时,会显示六列
但我想要三个联合两个列的列

有没有办法可以加入两个列表并联合列表?

我可以选择两个,但我想要一个。

4 个答案:

答案 0 :(得分:2)

试试这个:

SELECT Word, PageNo, Position
FROM t
WHERE PageNo IN (SELECT PageNo
                 FROM t
                 WHERE word IN ('A', 'B')
                 GROUP BY PageNo
                 HAVING COUNT(DISTINCT word) = 2)

答案 1 :(得分:2)

select * from tablename
where PageNo in
    (select PageNo
     from tablename
     where Word in ('A','B')
     group by PageNo
     having count(distinct Word) >= 2)

答案 2 :(得分:0)

如果是Oracle - 您可以使用INTERSECT

答案 3 :(得分:0)

您也可以使用EXISTS()

SELECT *
FROM YourTable t
WHERE EXISTS(SELECT 1
             FROM YourTable s
             WHERE s.word IN ('A', 'B')
             AND t.pageno = s.pageno
             GROUP BY s.PageNo
             HAVING COUNT(DISTINCT s.word) = 2)