2017-05-03 87 views
1

我有一个DB2表(messages),用于跟踪用户之间的消息。有一列message_id以及一个跟踪回复名为response_id的列(message.response_id是键入message.id这是线程中的第一条消息,因此给定线程中除第一条消息之外的任何消息将具有相同的response_id,而线程中的第一条消息有一个nullmessage.response_id)。SQL查询count AND存在

还有另一个表(reads)跟踪消息的读取内容,并通过名为reads.message_id的列FK返回到messages表。

由于一个错误,一些消息读取没有得到记录。

我需要找到所有message S其中message.response_id不为空(所以他们不是父消息)没有纪录reads(再好reads.message_id = message.id),但父消息确实有一个有效的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

我可能会错过一些东西,但我认为你的“伪SQL”看起来像实际的SQL,它应该完全按照你的意思去做。它究竟如何不足? –

回答

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是否为空的检查,因为它是由第一个连接执行的。

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); 
+0

这是关闭的,我已经添加了一些psuedo sql以上,以使它更清楚我在找什么 – user101289