如何选择表中的所有记录,不包括另一个记录

时间:2016-03-05 17:39:48

标签: sql select join

我有2个表格,其中包含有关页面和页面所属类别的信息,这些页面不必具有任何类别,也可以包含多个类别。

page
 pageid      title
  1          page1
  2          page2
  3          page3
  4          page4

category
 pageid   category
  2       cat1
  2       obsolete
  3       cat2

我想写一个选择所有页面的查询,只要它们没有被归类为“过时的”。

从上面看,我正在寻找的输出是:

1     page1
3     page3
4     page4

因此,第2页被排除在外,因为其中一个类别已经过时'页表中的所有其他行只应列出一次,即使它们在类别表中没有类别或多个类别。

我尝试了多个子查询和连接组合,但无法实现我想要生成的输出。

2 个答案:

答案 0 :(得分:2)

使用NOT EXISTS

SELECT *
FROM   page p
WHERE  NOT EXISTS (SELECT pageid
                   FROM   category c
                   WHERE  p.pageid = c.pageid
                          AND category = 'obsolete'); 

使用Conditional AggregateEXISTS

的另一种方式
SELECT *
FROM   page p
WHERE  EXISTS (SELECT 1
               FROM   category c
               WHERE  p.pageid = c.pageid
               HAVING Count(CASE WHEN category = 'obsolete' THEN 1 END) = 0); 

答案 1 :(得分:0)

 select distinct title from page 
 where pageid not in (select pageid from category where category='obsolete');

dplyr