假设我有两个表,一个包含博客帖子,另一个包含读者及其评论:
表1:
表名:BlogPosts:
结构:
id (int)
title (string)
表2:
表名:读者:
id (int)
blog_post_id (int)
name (string)
comment (string)
在Readers表中,blog_post_id / name上有一个唯一的复合键(即每个帖子每个读者有一条评论),但这对我的问题可能无关紧要。
我希望能够做一个查询告诉我每个BlogPost上特定读者的评论是什么,但它应该包括没有为该读者输入评论的BlogPosts(因此查询应该为每个读者返回一行数据库中的博客文章。)
我尝试了几种看起来像这样的变体:
SELECT
BlogPosts.id,
BlogPosts.title,
Readers.name,
Readers.comment
FROM
BlogPosts
RIGHT JOIN Readers ON
(BlogPosts.id = Readers.blog_post_id)
WHERE Readers.name = "joe"
..这只返回实际上有来自joe的评论的行。除非我包含where子句,否则我能够获得所有博客帖子的其他变体给了我一个无效的标识符。
我正在使用Oracle Express 10g以防万一。
感谢您的帮助。
答案 0 :(得分:5)
除非您想将WHERE
子句移动到连接中,否则一切看起来都是正确的,如下所示:
SELECT BlogPosts.id,
BlogPosts.title,
Readers.name,
Readers.comment
FROM BlogPosts
RIGHT JOIN Readers ON BlogPosts.id = Readers.blog_post_id
AND Readers.name = 'joe'
当您将Readers.name = 'joe'
放入WHERE
子句时,可以有效地将OUTER JOIN变为INNER JOIN。
编辑:
感谢OP在评论中做出澄清
您在最近的评论中描述的内容只需从右连接切换到左连接(如前面另一位评论者所建议的那样)即可实现。
请注意,每个帖子有多个评论时,每个BlogPost可以获得多行。