select col_1,
       col_2
  from tbl_a A,
       tbl_b B,
       ( select col_1,col_2 from tbl_c where clo_c_1 <> '1' ) C
 where A.col_1 = B.col_1
   and A.col_2 = B.col_2
   and (A.col_2 = B.col_2
    or  C.col_2 = A.col_2);

Моя среда - это Oracle, когда я запускаю этот SQL, если дополнительный SQL C не получил результата, тогда весь SQL возвращает NULL, тогда как если C имеет результат (не null), который соответствует другим условиям, может быть результат . Может кто-нибудь объяснить, почему sub SQL в области from должен быть не NULL? Большое спасибо.

0
Hare4096 1 Май 2014 в 10:38

2 ответа

Лучший ответ

Вам нужно окунуться в 90-е и начать использовать стандартные объединения:

select col_1,
       col_2
  from tbl_a A
          inner join
       tbl_b B
          on A.col_1 = B.col_1
             and A.col_2 = B.col_2
          left join
       ( select col_1,col_2 from tbl_c where clo_c_1 <> '1' ) C
          on
             C.col_2 = A.col_2

Как предположение. Я не совсем уверен, какими должны быть ваши условия присоединения, но это моя первая попытка.

3
Damien_The_Unbeliever 1 Май 2014 в 06:42

Это ожидаемое поведение. Когда вы объединяете два набора результатов, вы хотите получить только те результаты, которые удовлетворяют критериям объединения. Если критерии не удовлетворены, вы не должны получать никаких результатов.

Если я запрошу запрос «найдите мне всех сотрудников старше 65 лет и узнайте их отделы», если нет сотрудников старше 65 лет, вы не ожидаете получить никаких результатов, даже если в базе данных есть несколько отделов.

SELECT emp.name, dept.dept_name
FROM   emp
JOIN   dept
ON     (emp.dept_no = dept.dept_no)
WHERE  emp.age > 65;

Как говорили другие, если вы действительно хотите получать строки независимо от того, имеет ли подзапрос какие-либо результаты, вам необходимо использовать внешнее соединение.

1
Jeffrey Kemp 1 Май 2014 в 08:20