2015-12-12 6 views
0

Попытка выяснить, как SQL возвращает список пользователей, когда что-то не находится в другой таблице. Я понимаю, что есть несколько способов сделать это, но какой предпочтительный метод? То, что у меня есть, - это мое предположение, которое не работает по мере необходимости.Запрос Oracle «NOT IN»

SELECT 
    n.nid, 
    n.title, 
    u.uid, 
    u.mail 
FROM node n 
JOIN field_data_field_status fs   ON n.nid=fs.entity_id 
JOIN flagging f       ON n.nid=f.entity_id 
JOIN users u        ON f.uid=u.uid 
JOIN profile p        ON p.uid=u.uid 
WHERE n.nid='891' 
    AND n.type='tournament' 
    AND fs.field_data_field_status_value='In_progress' 
    AND p.pid NOT IN (select entity_id FROM field_data_field_selected_players)"; 

В этом примере entity_id от field_data_field_selected_players будет равна p.pid.

Поэтому я хочу, чтобы список пользователей, у которых нет p.pid, находится в entity_id от field_data_field_selected_players.

+2

'который не работает при необходимости', это ничего не говорит. Поработайте над этим. –

+1

Было бы полезно объяснить, почему ваш запрос не работает, каковы ожидаемые результаты и что вы получили, а также некоторые тестовые данные и структуры таблиц были бы полезными. – Ollie

ответ

1

Ваш запрос ommiting профили, которые не имеют записи в field_data_field_selected_players, где вы говорите, вы хотите, чтобы это было пользователей быть опущен. Таким образом, это, по сути, пользователи, у которых нет профиля с такой записью. Следовательно, предложение NOT IN должно искать пользователей.

SELECT 
    n.nid, 
    n.title, 
    u.uid, 
    u.mail 
FROM node n 
JOIN field_data_field_status fs   ON n.nid=fs.entity_id 
JOIN flagging f       ON n.nid=f.entity_id 
JOIN users u        ON f.uid=u.uid 
WHERE n.nid='891' 
    AND n.type='tournament' 
    AND fs.field_data_field_status_value='In_progress' 
    AND u.uid NOT IN 
    (
    select p.uid 
    from profile p 
    where p.pid IN (select entity_id FROM field_data_field_selected_players) 
); 

То же самое можно сделать с помощью EXISTS/NOT EXISTS, конечно. В основном это вопрос личных предпочтений, которые нужно выбирать. Я часто предпочитаю IN/NOT IN для их простоты.