计数和SQL的SQL查询存在

时间:2017-05-03 21:11:40

标签: sql join db2

我有一个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)

2 个答案:

答案 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的检查,因为它是由第一次加入强制执行的。