2016-03-05 3 views
1

У меня есть 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

Использование 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); 
0
select * from page 
where pageid not in (select pageid from category where category='obsolete'); 

или

select distinct title from page 
where pageid not in (select pageid from category where category='obsolete'); 
Смежные вопросы