让我们考虑这两个表:
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
)。此用户可能有其他消息,如果他们都没有满足这些条件,那么我的请求应
这个查询应该是什么样的?
答案 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 IN
和LEFT 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)