2010-10-10 48 views
2

假設我有兩個表,一個與博客和其他與讀者和他們的評論:SQL:適當加入語法

表1:

表名:相關博客文章:

結構:

id (int)

title (string) 

表2:

表名:讀者:

id (int)

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

在讀者表上有blog_post_id /名稱的獨特的複合密鑰(即每個帖子每個讀者發表一條評論),儘管這對我的問題可能無關緊要。

我希望能夠做一個單一的查詢告訴我每個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" 

..this剛返回這裏居然有從喬註釋行。當我能夠獲得所有博客文章的其他變體給我一個無效的標識符,每當我包括where子句。

我在使用Oracle Express 10g的情況下,有任何區別。

感謝您的任何幫助。

回答

4

一切看起來是正確的,只是要在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' 

您有效地使OUTER JOIN成一個內圈之一,當你把Readers.name = 'joe'WHERE子句。

編輯:
感謝OP在評論中的澄清。
只需從RIGHT JOIN切換到LEFT JOIN即可(如之前的其他評論者所建議的那樣),您可以在最近評論中描述的內容。
請注意,如果每個帖子有多條評論,則您可以爲每個BlogPost獲取多個行。

+1

這將起作用,但您可能需要考慮將RIGHT JOIN更改爲左外連接。無論出於何種原因,至少在與我合作的每個系統和開發人員中,LEFT都比RIGHT更受歡迎(但是如果其他人有不同的體驗,我會很感興趣)。我知道這只是一種風格,對於這個特定的查詢並不重要,但這可能是一個很好的習慣。 – 2010-10-10 02:20:28

+0

這是我嘗試過的變化之一。我得到:ORA-00904:「joe」:無效標識符 – 2010-10-10 04:38:22

+0

改爲使用單引號。我編輯了我的答案。 – bernie 2010-10-10 05:34:53