我有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页被排除在外,因为其中一个类别已经过时'页表中的所有其他行只应列出一次,即使它们在类别表中没有类别或多个类别。
我尝试了多个子查询和连接组合,但无法实现我想要生成的输出。
答案 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 Aggregate
和EXISTS
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