#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
значения в последнюю очередь.