SQL: правильный синтаксис соединения - PullRequest
2 голосов
/ 10 октября 2010

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

Таблица 1:

Имя таблицы: BlogPosts:

структура:

id (int)

title (string)

Таблица 2:

Название таблицы: Читатели:

id (int)

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

inВ таблице 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 Ответ

5 голосов
/ 10 октября 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...