Вы заказываете общий набор результатов, а не каждую ветвь объединения; поэтому вам нужно избавиться от первого order by
предложения:
...
or b.DATE1 >= TO_DATE('2018-01-01','YYYY-MM-DD'))
union all
select a.ID1, a.ID2, cnt, a.*, j.*
...
order by ID2 asc
Это упоминается в документации :
Вы не можете указать order_by_clause в подзапросе этих операторов.
Кстати, если вы предоставляете фиксированные даты, вы можете использовать литералы даты , которые немного меньше набрав:
or b.DATE1 >= DATE '2018-01-01')
И, как указал @Littlefoot, в этом предложении order-by будет выбрано «ORA-00960: неоднозначное именование столбцов в списке выбора», поскольку у вас есть a.ID1, a.ID2, ... a.*
, что означает ID1 и ID2 столбцы появятся дважды в списке выбора, и Oracle не знает, какую ссылку ID1 вы имеете в виду (здесь они имеют одинаковое значение, но не обязательно). Не рекомендуется использовать .*
- намного лучше перечислять столбцы, которые вам действительно нужны.
Также плохая идея смешивать объединения ANSI (как во второй ветви) с соединениями старого стиля ( как в вашей первой ветке); Вы можете сойти с рук здесь, но это может сбить с толку оптимизатора, как и любого другого, кто смотрит на код, и даже это может когда-нибудь сломаться. Вы использовали (+)
, но не всегда, так что в любом случае это будет внутренним соединением; но если вы хотите внешнее соединение, запишите его как правильное ANSI.