Проблема с ‘order by’ с использованием вычитания между датами (одна из них исходит из запроса)

#sql #oracle #date

#sql #Oracle #Дата

Вопрос:

Я не знаю, возможно ли это вообще, но я хочу упорядочить результаты моего запроса по времени, прошедшему между двумя датами, одна из которых исходит из запроса.

Я хочу упорядочить альбомы с ДИСКОВ так, чтобы те, у которых REL_DATE ближе к другой дате (заданной вторым запросом), появлялись первыми. Запрос «SELECT ORDER_S …» возвращает единственную дату, извлеченную из другой таблицы, и отлично работает сам по себе.

 SELECT ALBUM
FROM DISCS
ORDER BY
  ABS((
  SELECT ORDER_S
  FROM SALE_LINE
  WHERE E_MAIL = (
    SELECT E_MAIL FROM CLIENTS
    WHERE DNI = 46470063
  ) AND ROWNUM = 1
  ORDER BY ORDER_S DESC)
  - REL_DATE) ASC;
  

Где ALBUM — атрибут строкового типа, а ORDER_S и REL_DATE — атрибуты типа ДАТЫ.

Однако все, что я получаю, это ошибка в ORDER BY ORDER_S DESC) строке «отсутствует правая скобка», и я не могу понять, почему.

Комментарии:

1. Пожалуйста, предоставьте образцы данных и желаемые результаты. Вы также должны описать, что вы хотите, чтобы запрос выполнял. Также укажите имена столбцов, чтобы было видно, из каких таблиц они исходят.

2. Спасибо за совет @GordonLinoff, я попытался добавить больше деталей, чтобы лучше объяснить ситуацию.

Ответ №1:

Правильный синтаксис будет:

 SELECT d.ALBUM
FROM DISCS d
ORDER BY
  ABS((SELECT MIN(sl.ORDER_S)
       FROM SALE_LINE sl
       WHERE sl.E_MAIL = (SELECT c.E_MAIL
                          FROM CLIENTS c
                          WHERE c.DNI = 46470063
                         ) 
      ) - d.REL_DATE
     ) ASC;
  

Я не могу сказать, делает ли это что-нибудь полезное.

Комментарии:

1. Спасибо, это решило проблему. Я полагаю, это было из-за ROWNUM странного поведения при интеграции внутри другого запроса.

2. Вычисляется rownum перед order by , поэтому ваш код не сделал то, что вы ожидали.