开发者

fetching rows without any filtered child row

开发者 https://www.devze.com 2023-01-22 03:42 出处:网络
The application manages (for the sake of simplicity) Topic and Messages posted to it by Users. Its structure is rather simple, and enforced by Foreign keys:

The application manages (for the sake of simplicity) Topic and Messages posted to it by Users. Its structure is rather simple, and enforced by Foreign keys:

There are 3 tables, Topics, Users and Messages.

The Topic and User entities are linked through an (,) cardinality link embodied by the Message Entity.

Message: (IdTopic,IdUser,Message)

The other entities aren't of any interest by themselves.

Now the question:

I need to return every topics for which a specific user hasn't made any reply (Message). As you imagine, the database diagram is constitued of 3 tables.

How do I do it without a complex query? I am quite sure the answer is easy... But it's far too late in th开发者_如何学Pythone night for me to think straight.


Using NOT EXISTS

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

Using NOT IN

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

Using 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

Performance Concerns

NOT IN and NOT EXISTS perform better than LEFT JOIN / IS NULL if the columns being compared (idtopic, isuser) are not nullable. See this link for details.


From what you've described I believe that this query will work. I'm sure that it can be made to be more efficient, but I wanted it to work and be simple and then you could figure out how to improve it if you want.

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

精彩评论

暂无评论...
验证码 换一张
取 消