获取没有任何过滤子行的行

时间:2010-10-25 23:08:29

标签: sql sql-server

应用程序管理(为简单起见)用户发布的主题和消息。它的结构相当简单,并由外键强制执行:

有3个表,主题,用户和消息。

主题和用户实体通过消息实体所体现的()基数链接进行链接。

Message: (IdTopic,IdUser,Message)

其他实体本身并不感兴趣。

现在的问题是:

我需要返回特定用户未做出任何回复的每个主题(消息)。如您所想,数据库图由3个表组成。

如果没有复杂的查询,我该怎么做?我很确定答案很简单......但是对我来说,直接思考已经​​太晚了。

2 个答案:

答案 0 :(得分:1)

使用NOT EXISTS

SELECT t.*
  FROM TOPICS t
 WHERE NOT EXISTS(SELECT NULL
                    FROM MESSAGES m
                   WHERE m.idtopic = t.idtopic
                     AND m.isuser = @userid)

使用NOT IN

SELECT t.*
  FROM TOPICS t
 WHERE t.idtopic NOT (SELECT m.idtopic
                        FROM MESSAGES m
                       WHERE m.isuser = @userid)

使用LEFT JOIN / IS NULL

   SELECT t.*
     FROM TOPICS t
LEFT JOIN MESSAGES m ON m.idtopic = t.idtopic
                      AND m.isuser = @userid
    WHERE m.message IS NULL

表现关注

如果要比较的列(idtopic,isuser)不可为空,则NOT IN和NOT EXISTS的性能优于LEFT JOIN / IS NULL。请参阅this link for details

答案 1 :(得分:0)

根据您所描述的内容,我相信此查询会起作用。我确信它可以变得更有效率,但是我希望它能够工作并变得简单,然后你可以想出如果你想要它如何改进它。

SELECT t.IdTopics
FROM Topics t 
WHERE t.IdTopics NOT IN (SELECT m.IdTopics 
                          FROM Messages m 
                          WHERE m.IdUser = @SpecificUser
                         )