我有一个DB2表(messages
)来跟踪用户之间的消息。有message_id
的列以及跟踪名为response_id
的回复的列(message.response_id
键入message.id
,这是线程中的第一条消息,因此任何消息在给定的线程中,除了第一条消息将具有相同的response_id
,而线程中的第一条消息具有null
message.response_id
)。
还有另一个表(reads
)跟踪对邮件的读取,并通过名为messages
的列FK返回reads.message_id
表。
由于存在错误,一些消息读取未被记录。
我需要找到message
不为空的所有message.response_id
s(所以它们不是父消息)在reads
中没有记录(没有reads.message_id = message.id
1}})但是父消息具有有效的read
(因此对于给定的孩子message
,存在匹配reads.message_id = message.response_id
的记录。)
这可能吗?或者我应该只查询主消息表,获取message.response_id
不为空的所有项目,然后再执行另一个查询以确定父记录是否有read
记录?
伪SQL:
SELECT * FROM messages m WHERE m.response_id IS NOT NULL
AND NOT EXISTS (SELECT 1 FROM reads r WHERE m.id = r.message_id)
AND EXISTS (SELECT 1 FROM reads r2 WHERE m.response_id = r2.message_id)
答案 0 :(得分:0)
这听起来像一个基本的not exists
:
select m.*
from messages m
where m.response_id is not null and
not exists (select 1 from messages m2 where m2.id = m.response_id);
答案 1 :(得分:0)
你“伪SQL”实际上是真正的SQL,应该可以工作。
您可以使用联接作为替代方法:
select * from messages m
join reads r2 on m.response_id = r2.message_id
left join reads r on m.id = r.message_id
where r.message_id is null
在某些情况下,这可能更有效。您可能需要根据数据重复删除结果。
并非我已经删除了对response_id是否为null的检查,因为它是由第一次加入强制执行的。