SQL:正确的连接语法

时间:2010-10-10 00:53:57

标签: sql oracle syntax join

假设我有两个表,一个包含博客帖子,另一个包含读者及其评论:

表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以防万一。

感谢您的帮助。

1 个答案:

答案 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可以获得多行。