代码之家  ›  专栏  ›  技术社区  ›  Eilistraee

获取没有任何筛选子行的行

  •  0
  • Eilistraee  · 技术社区  · 14 年前

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

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

    Message: (IdTopic,IdUser,Message)
    

    现在的问题是:

    我需要返回每一个主题,其中一个特定的用户没有作出任何答复(消息)。如您所想,数据库关系图由3个表组成。

    2 回复  |  直到 14 年前
        1
  •  1
  •   OMG Ponies    14 年前

    使用不存在

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

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

    使用左联接/为空

       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

        2
  •  0
  •   Adam Porad    14 年前

    根据你所描述的,我相信这个查询会起作用。我确信它可以变得更有效率,但是我希望它能工作并且简单,然后你可以想办法改进它如果你想的话。

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