Правильно ли присоединиться к этому запросу? - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть таблица в базе данных PostgreSQL 9.2.24:

CREATE TABLE episodes_list (
  mid      serial PRIMARY KEY  -- movie id
, title    text NOT NULL
, is_movie integer NOT NULL    -- 1 for movie, 0 for episode
);

Мне нужно отображать названия эпизодов слева, названия всех фильмов справа (даже те, которые не имеют эпизодов).).

103 | Microcosmos (high quality)                    |        1
103 | Snails' sexual act                            |        0
103 | Landing                                       |        0

Вот несколько записей.Так, например.«Микрокосмос» должен быть справа дважды, с половым актом улитки и приземлением слева.Вот как это должно выглядеть:

 Landing                                       | Microcosmos (high quality)
 Snails' sexual act                            | Microcosmos (high quality)

Я написал что-то вроде этого:

select e1.title, e2.title from episodes_list e1 right join episodes_list e2 on e1.is_movie = 0 and e2.is_movie = 1 and e1.mid = e2.mid;

Но он по-прежнему показывает правильные заголовки эпизодов, а не только названия фильмов (поэтому яЯ получаю дополнительные строки, которые я не должен получать).Так это выглядит так: Но это выглядит так:

 Landing                                       | Microcosmos (high quality)
 Snails' sexual act                            | Microcosmos (high quality)
                                               | Snails' sexual act

Что я здесь не так делаю и как должен выглядеть запрос?

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Требуется самостоятельное ЛЕВОЕ СОЕДИНЕНИЕ для таблицы, которая выбирает записи эпизодов, с предложением WHERE, которое фильтрует только фильмы.

Приведенный ниже запрос должен выполнить работу:

select 
    e2.title, 
    e1.title 
from episodes_list e1 
left join episodes_list e2 
    on e2.is_movie = 0
    and e1.mid = e2.mid
where e1.is_movie = 1

e1 представляет записи фильма.e2 представляет записи эпизодов.Левое объединение позволяет учитывать фильмы без эпизодов.

0 голосов
/ 17 декабря 2018

Это может быть ваш запрос:

SELECT epi.title AS episode, mov.title AS movie
FROM        episodes_list epi
RIGHT  JOIN episodes_list mov ON epi.is_movie = 0
                             AND mov.mid = epi.mid
WHERE  mov.is_movie = 1;

Возвращает все фильмы справа, расширенные с эпизодами слева, где это доступно.

is_movieвместо этого должен быть флаг boolean.integer неправильный тип.

Самый важный момент, который нужно от него отнять: отформатируйте ваши запросы (любым непротиворечивым способом, не обязательно похожим на мой) и используйте описательные псевдонимы, когда все усложняется.

У вас возникла логическая проблема: условия в предложении WHERE эквивалентны условиям в предложении INNER JOIN, но не условиям в OUTER JOIN. (LEFT JOIN / RIGHT JOIN - это сокращение от LEFT OUTER JOIN / RIGHT OUTER JOIN.)
См .:

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