sql server查询外连接问题

时间:2013-04-24 20:05:48

标签: sql sql-server

我有3个表:帖子,用户和收藏夹

Post
----------
PostId
Nombre
UserId
Banned

User
----------
UserId
UserName
Info

Favorites
-----------
PostId
UserId

我正在尝试获取所有帖子并告知帖子是否为收藏夹,因此如果帖子不在收藏夹中,它将显示在查询中,但收藏标志将为false。

这是我的疑问:

SELECT
 p.Nombre as title,
 CASE ISNULL(f.PostId,0) WHEN 0 THEN 'false' ELSE 'true' END as favorito
 FROM Post p 
 inner join User u on p.UserId = u.UserId 
 left outer join Favorite f on p.PostId = f.PostId 
 where 
 p.Banned = 0 

并返回所有内容,并告知收藏夹中是否有记录,但是当我在哪里添加过滤器

 and f.UsuarioId = 4

仅返回用户喜欢的帖子。不应该在使用左外连接或全外连接时,如果辅助表中的记录不存在,则应该从主表返回记录吗?

¿如何在辅助表上返回所有使用过滤器的帖子?谢谢!

1 个答案:

答案 0 :(得分:1)

由于您已对f.UsuarioId = 4进行了过滤,因此要求LEFT OUTER JOIN具有特定值的记录,从而有效地将INNER JOIN转换为Favorite。要仍然返回所有没有相关Favorite的内容,您必须在该表中测试NULL

SELECT
 p.Nombre as title,
 CASE ISNULL(f.PostId,0) WHEN 0 THEN 'false' ELSE 'true' END as favorito
FROM
  Post p 
  INNER JOINUser u ON p.UserId = u.UserId 
  LEFT OUTER JOIN Favorite f ON p.PostId = f.PostId 
WHERE 
 p.Banned = 0 
 -- Return either those related Favorite records for UsuarioId = 4 or the NULLs
 -- meaning a related record does not exist
 AND (f.UsuarioId = 4 OR f.UsuarioId IS NULL)