Объединение таблиц для отображения null, если в правой боковой таблице нет данных

#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 предложению. Я отредактировал свой ответ.