使用连接查询从第二个表中检索缺少的数据

时间:2011-01-10 15:41:51

标签: sql oracle

让我们考虑这两个表:

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 个答案:

答案 0 :(得分:4)

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 INLEFT JOIN

答案 1 :(得分:2)

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

答案 2 :(得分:2)

SELECT user_id FROM t_user t where not exists ( select 1 from t_message where user_id = t.user_id and ... )

答案 3 :(得分:0)

怎么样

SELECT * FROM T_USER WHERE user_id NOT IN 
       (SELECT user_id FROM T_MESSAGE WHERE msgType = 1 AND answered = 0)