У меня есть две таблицы:
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 для решения подобных проблем.
Вы не четко указываете, какие строки входят в результат в зависимости от ввода. Предоставляя бизнес-отношение (корабль) / ассоциацию или таблицу (базу или результат запроса), скажите, что строка в ней сообщает о бизнес-ситуации или входных таблицах с точки зрения значений ее столбцов. Итак: у меня есть строка (studentid, ...); при каких условиях он попадает в результат?
Вероятно, вы могли бы использовать LEFT JOIN USING с подзапросом RHS завершенных курсов. Но это то же самое, что LEFT JOIN с курсами RHS ON ids = & isfinished. Если вам нужны только строки, в которых student = 1, вы можете использовать подзапрос LHS student в случае USING или добавить окончательный WHERE в любом случае.
Отвечает ли это на ваш вопрос? Левое внешнее соединение не возвращает все строки из моей левой таблицы?





Разве это не то, что вы ищете:
select * from student s
left outer join courseregistration cr
on s.studentid = cr.studentid
and cr.isfinished = false
where s.studentid = 1
db <> рабочий пример здесь
LEFT JOIN возвращает INNER JOIN строки UNION ВСЕ несопоставленные строки левой таблицы, расширенные на NULL. Всегда знайте, какое ВНУТРЕННЕЕ СОЕДИНЕНИЕ вы хотите как часть ВНЕШНЕГО СОЕДИНЕНИЯ. После LEFT JOIN, WHERE, HAVING или INNER JOIN, который требует, чтобы правый [sic] столбец таблицы был не NULL, удаляет все строки с введенными NULL, т.е. оставляет только строки INNER JOIN, т.е. «превращает OUTER JOIN во INNER JOIN». Это у тебя есть. PS Это faq. Но вы должны написать много ясных, кратких и точных формулировок вашего вопроса / проблемы / цели, чтобы иметь возможность искать.