2010-10-10 2 views
2

Предположим, у меня есть две таблицы, одна с блога, а другой с читателями и их комментарии:SQL: Proper Регистрация Синтаксис

Таблица 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" 

..выполняется просто возвращает строки, где Eсть фактически комментарий от Джо. Другие варианты, в которых мне удалось получить все сообщения в блоге, дали мне недопустимый идентификатор, когда я включил предложение 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.

Редактировать:
Благодаря ОП для пояснения в комментариях.
То, что вы описываете в своем последнем комментарии, может быть достигнуто просто путем перехода от ПРАВОГО СОЕДИНЕНИЯ к ЛЕВЫМ СОЕДИНЕНИЕМ (как было предложено ранее другим комментатором).
Обратите внимание, что вы можете получить более одной строки на BlogPost, если в сообщении есть несколько комментариев.

+1

Это будет работать, но вы можете захотеть изменить ПРАВОЕ СОЕДИНЕНИЕ В ЛЕВЫЙ ВНЕШНИЙ ВСТУПИТЕЛЬ. По какой-то причине LEFT намного более популярен, чем RIGHT, по крайней мере, с каждой системой и разработчиком, с которым я работал (но мне было бы интересно услышать, есть ли у других людей разные впечатления). Я знаю, что это просто стиль, который не имеет особого значения для этого конкретного вопроса, но, вероятно, это хорошая привычка. –

+0

Это одна из тех вариаций, которые я пробовал. Я получаю: ORA-00904: «joe»: неверный идентификатор –

+0

Вместо этого используйте одиночные кавычки. Я отредактировал свой ответ. – bernie

Смежные вопросы