2016-04-16 3 views
0

Я пытаюсь изучить SQL, и у меня здесь небольшая проблема.Функция SQL - EXISTS/NOT EXISTS

ID | P_Id | room | 
====================== 
1 | 8 | A | 
2 | 8 | A | 
3 | 8 | B | 
4 | 9 | B | 
5 | 9 | B | 
6 | 10 | C | 
7 | 10 | C | 
8 | 10 | D | 

Я пытаюсь выяснить, какие P_Id имеет только работал в комнате B. Таким образом, результат будет P_Id = 9. Также не 8, потому что он тоже работал в комнате А.

Это мой запрос, но он не работает:

SELECT Room.P_Id 
FROM Room 
WHERE NOT EXISTS (SELECT * 
        FROM Room 
        WHERE Room.room <> 'B'); 

Не могли бы вы, ребята, помочь мне здесь?

ответ

2

Вам необходимо сопоставить подзапрос с внешним запросом и использовать различные псевдонимы во внешних и внутренних запросах, иначе подзапрос будет использовать неправильную таблицу. Корреляция гарантирует, что подзапрос применяется к правильной строке во внешнем запросе (где соответствует P_Id).

ли это вместо:

SELECT DISTINCT r1.P_Id 
FROM Room r1 
WHERE NOT EXISTS (
    SELECT * 
    FROM Room r2 
    WHERE r2.room <> 'B' 
    AND r1.P_Id = r2.P_Id 
); 
0

Как об этом:

Select Room.P_Id 
FROM Room 
WHERE MIN(room.room) = MAX(room.room) and MIN(room.room) = 'B' 
Group by Room.P_Id 

Там могут быть и другие более изящные способы, но это будет получить работу.

0

Попробуйте

Select distinct p_ID 
from room 
where room = 'B' 
    and p_id not in (Select p_ID from room where room <> 'B') 
0

Вы также можете попробовать

SELECT DISTINCT P_Id 
FROM Room 
WHERE NOT EXISTS (SELECT P_Id FROM Room WHERE room <>'B');