Необязательный фильтр по столбцу внешней объединенной таблицы в предложении where

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

create table student
(
    studentid       bigint primary key not null,
    name            varchar(200)        not null
);

create table courseregistration
(
    studentid       bigint not null,
    coursenamename  varchar(200) not null,
    isfinished        boolean default false
); 

--insert some data
insert into student values(1,'Dave');
insert into courseregistration values(1,'SQL',true);

Теперь я хочу внешнее объединить student с courseregistration, но отфильтровать courseregistration на isfinished=false. Обратите внимание, что я все еще хочу получить ученика.

Попытка этого не возвращает строк:

select * from student
left outer join courseregistration using(studentid)
where studentid = 1
and courseregistration.isfinished = false

В приведенном выше примере я бы хотел получить набор результатов с 1 строкой ученика, но строки курса равны нулю (потому что единственный пример имеет isfinished=true). Но есть еще одно ограничение. Если в courseregistration нет соответствующей строки, все равно должен быть результат для записи студента.

Это скорректированный пример. Я могу настроить свой код, чтобы решить эту проблему, но мне действительно интересно, каков «правильный / разумный способ» решения этой проблемы в postgresql?


PS Я ранее использовал (+) в Oracle для решения подобных проблем.

LEFT JOIN возвращает INNER JOIN строки UNION ВСЕ несопоставленные строки левой таблицы, расширенные на NULL. Всегда знайте, какое ВНУТРЕННЕЕ СОЕДИНЕНИЕ вы хотите как часть ВНЕШНЕГО СОЕДИНЕНИЯ. После LEFT JOIN, WHERE, HAVING или INNER JOIN, который требует, чтобы правый [sic] столбец таблицы был не NULL, удаляет все строки с введенными NULL, т.е. оставляет только строки INNER JOIN, т.е. «превращает OUTER JOIN во INNER JOIN». Это у тебя есть. PS Это faq. Но вы должны написать много ясных, кратких и точных формулировок вашего вопроса / проблемы / цели, чтобы иметь возможность искать.

philipxy 10.04.2021 01:10

Вы не четко указываете, какие строки входят в результат в зависимости от ввода. Предоставляя бизнес-отношение (корабль) / ассоциацию или таблицу (базу или результат запроса), скажите, что строка в ней сообщает о бизнес-ситуации или входных таблицах с точки зрения значений ее столбцов. Итак: у меня есть строка (studentid, ...); при каких условиях он попадает в результат?

philipxy 10.04.2021 01:10

Вероятно, вы могли бы использовать LEFT JOIN USING с подзапросом RHS завершенных курсов. Но это то же самое, что LEFT JOIN с курсами RHS ON ids = & isfinished. Если вам нужны только строки, в которых student = 1, вы можете использовать подзапрос LHS student в случае USING или добавить окончательный WHERE в любом случае.

philipxy 10.04.2021 01:26
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
21
1

Ответы 1

Разве это не то, что вы ищете:

select * from student s
left outer join courseregistration  cr
   on s.studentid = cr.studentid
   and cr.isfinished = false
where s.studentid = 1

db <> рабочий пример здесь

Другие вопросы по теме