объединение 2 таблиц и приведение конкретной записи к началу

#sql #oracle #oracle11g #left-join #sql-order-by

#sql #Oracle #oracle11g #левое соединение #sql-порядок по

Вопрос:

У меня есть 2 таблицы. в первой таблице много строк, но во второй таблице есть только одна 1 or 0 запись. Если вторая таблица содержит одну запись, то эта запись первой таблицы должна быть вверху. если вторая таблица не содержит записи, то должна отображаться вся запись первой таблицы. первая таблица:

 DEPT:-
10  ACCOUNTING  NEW YORK
20  RESEARCH    DALLAS
30  SALES   CHICAGO
40  OPERATIONS  BOSTON
  

Вторая таблица

 EMP:-
1000    Shruti  40
  

например, если я присоединюсь к таблице, то вверху должно быть около 40 таблиц. Я написал ниже запрос, и он работает

 select d.deptno,d.dname ,d.loc,e.empno,e.deptno from dept d ,emp e where d.deptno= e.deptno( ) and d.deptno in(select deptno from emp)
UNION ALL
select d.deptno,d.dname ,d.loc,e.empno,e.deptno from dept d ,emp e where d.deptno= e.deptno( ) and d.deptno not in(select deptno from emp);
  

Как я могу изменить приведенный выше запрос, чтобы отображалась вся запись dept таблицы, если в таблице emp нет записи.

Ответ №1:

Я думаю, вам нужны a left join и условная сортировка:

 select d.*, e.empno
from dept d
left join emp e on e.deptno = d.deptno
order by case when e.deptno is not null then 0 else 1 end, d.deptno
  

В зависимости от ваших данных вы можете упростить это следующим образом:

 order by e.deptno, d.deptno
  

Это использует тот факт, что сортировка по возрастанию помещает null значения в последнюю очередь.