Использование запроса на соединение для извлечения отсутствующих данных из второй таблицы - PullRequest
1 голос
/ 10 января 2011

Давайте рассмотрим эти две таблицы:

TABLE(T_USER)
  user_id

TABLE(T_MESSAGE)
 msg_type (values = 0, 1, 2, 3)
 answered (values = 0, 1)
 user_id

Как видите, для любого пользователя может быть сообщение 0 - n.

Я пытаюсь получить, используя SQL-запрос (на Oracle 10g ), список всех пользователей, для которых нет сообщение определенного типа и без ответа существует (т.е. where msgType = 1 and answered = 0 например). У этого пользователя могут быть другие сообщения, если ни одно из них не соответствует этим критериям, тогда мой запрос должен

Как должен выглядеть этот запрос?

Ответы [ 4 ]

4 голосов
/ 10 января 2011
SELECT *
  FROM T_USER u
 WHERE NOT EXISTS (SELECT NULL
                     FROM T_MESSAGE
                    WHERE user_id = u.user_id
                      AND msgType = 1
                      AND answered = 0)

Также хочу заметить, что решение с NOT EXISTS будет более производительным в Oracle, чем NOT IN и LEFT JOIN.

2 голосов
/ 10 января 2011
SELECT user_id FROM t_user t where not exists ( select 1 from t_message where user_id = t.user_id and ... )
2 голосов
/ 10 января 2011
select u.user_id
    from T_USER u
        left join T_MESSAGE m
            on u.user_id = m.user_id
                and m.msgType = 1
                and m.answered = 0
    where m.user_id is null
0 голосов
/ 10 января 2011

Как насчет

SELECT * FROM T_USER WHERE user_id NOT IN 
       (SELECT user_id FROM T_MESSAGE WHERE msgType = 1 AND answered = 0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...