【问题标题】:SQL: Proper Join SyntaxSQL:正确的连接语法
【发布时间】:2011-04-23 08:21:05
【问题描述】:

假设我有两张表,一张是博客文章,另一张是读者和他们的 cmets:

表 1:

表名:BlogPosts:

结构:

id (int)

title (string)

表 2:

表名:读者:

id (int)

blog_post_id (int)
name (string)
comment (string)

在 Readers 表中,blog_post_id/name 上有一个唯一的复合键(即每个读者每篇文章一条评论),尽管这对我的问题可能无关紧要。

我希望能够进行单个查询,告诉我特定读者对每个 BlogPost 的评论是什么,但它应该包括没有为该读者输入评论的 BlogPost(因此查询应该为每个返回一行数据库中的博客文章)。

我尝试了几种看起来像这样的变体:

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

感谢您的帮助。

【问题讨论】:

    标签: sql oracle syntax join


    【解决方案1】:

    除了您想将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 子句中时,您实际上将外部联接变成了内部联接。

    编辑:
    感谢 OP 在 cmets 中的澄清。
    您在最近的评论中描述的内容可以简单地通过从 RIGHT JOIN 切换到 LEFT JOIN 来实现(正如另一位评论者之前所建议的那样)。
    请注意,当每个帖子有多个 cmets 时,每个 BlogPost 可以获得不止一行。

    【讨论】:

    • 这可行,但您可能需要考虑将 RIGHT JOIN 更改为 LEFT OUTER JOIN。无论出于何种原因,LEFT 比 RIGHT 更受欢迎,至少在我合作过的每个系统和开发人员中(但我很想知道其他人是否有不同的经历)。我知道这只是一种风格,对于这个特定的查询并不重要,但这可能是一个好习惯。
    • 这是我尝试过的变体之一。我得到:ORA-00904: "joe": invalid identifier
    • 嗯...更改为单引号使查询工作它没有返回预期的结果。这是直接从命令提示符粘贴的确切查询:SELECT BlogPosts.id, BlogPosts.title, Readers.name, Readers.comment_text FROM BlogPosts RIGHT JOIN Readers ON BlogPosts.id = Readers.blog_post_id AND Readers.name = 'joe'
    • 返回的两行在 id 和 title 字段中有空值。
    • 对不起,这很难读,但我对这段代码“编辑器”不是很好
    猜你喜欢
    • 2016-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-08
    • 2023-01-03
    • 1970-01-01
    • 1970-01-01
    • 2013-06-10
    相关资源
    最近更新 更多