#sql #oracle #join #left-join #where-clause
#sql #Oracle #Присоединиться #объединение слева #where-предложение
Вопрос:
У меня есть таблица feedback_ques, feedback_ans следующим образом:
feedback_ques
id question created_date created_by delete_date
1 How was the training 16-SEP-20 900 null
2 facility? 16-SEP-20 900 null
3 Dept? 16-SEP-20 902 null
4 Infrastructure 16-SEP-20 900 16-SEP-20
feedback_ans
ques_id member_id answers created_date created_by
1 10 good 16-SEP-20 891
2 10 good 16-SEP-20 891
3 10 poor 16-SEP-20 891
4 10 good 16-SEP-20 891
Я хочу объединить таблицы следующим образом:
select q.id as id, a.member_id as memberId, q.question as Ques, a.answers as Ans
from feedback_ques q, feedback_ans a
where q.id = a.ques_id( )
and a.member_id = 10
and q.DELETE_DATE IS NULL;
Это дает мне все поля. Я хочу, чтобы запрос возвращал null для ответов, если они не найдены в таблице ответов.
Например, member_id 20 не имеет ответов, поэтому я бы хотел, чтобы в таблице отображались значения null, как показано ниже для этого запроса.
select q.id as id, a.member_id as memberId, q.question as Ques, a.answers as Ans
from feedback_ques q, feedback_ans a
where q.id = a.ques_id( )
and a.member_id = 20
and q.DELETE_DATE IS NULL;
ID memberId Ques ans
1 20 How was the training null
2 20 facility? null
3 20 Dept? null
4 20 Infrastructure null
Обновлено:
Как и предлагалось, я использую соединение по левому краю следующим образом:
select q.id as id, a.member_id as memberId, q.question as Ques, a.answers as Ans
from feedback_ques q
left join feedback_ans a on a.ques_id = q.id and a.member_id = 20
and q.delete_date is null;
Но этот запрос не работает, когда delete_date равен !=null. Эта строка все еще возвращается запросом. Из приведенного выше задания 4 не следует возвращать, поскольку delete_date != null.
Не могли бы вы, пожалуйста, помочь.
Ответ №1:
Эти старые, неявные объединения затрудняют выражение того, что вы хотите. Здесь условие a.member_id = 20
в предложении where отфильтровывает несогласованные строки.
Это всего лишь одна из причин, по которой всегда следует использовать явные стандартные объединения. Рассмотрим left join
, где все условия в левой таблице помещены в on
предложение:
select q.id as id, a.member_id as memberId, q.question as Ques, a.answers as Ans
from feedback_ques q
left join feedback_ans a on a.ques_id = q.id and a.member_id = 20
where q.delete_date is null;
Комментарии:
1. есть еще один вопрос. Скажем, например, q.delete_date != null, это левое внешнее соединение все равно получает эту строку.
2. @JNPW:
q.delete_date IS NOT NULL
3. извините, я не был ясен. Я не спрашиваю, как использовать != null. Если вы видите мой обновленный вопрос и значения таблицы, вопрос 4 не следует извлекать, когда существует ответ обратной связи, но дата удаления не равна нулю
4. @JNPW: тогда это условие должно соответствовать
where
предложению. Я отредактировал свой ответ.