06:44
1,0×
00:00/06:44
519 тыс смотрели · 4 года назад
1327 читали · 6 лет назад
Печеньки от Oracle. Иерархический запрос
В таблице одна строка. Как извлечь из нее 10 строк? Как сформировать последовательность? Календарь? Побочные "плюшки" иерархического SQL запроса в Oracle. Таблица dual Если нам нужно получить SQL запросом текущую дату, то в Oracle мы пишем: select sysdate from dual ; 31.03.19 В некоторых диалектах SQL для скаляра (текущая дата - скаляр) можно записать без from dual, но Oracle требует полноты минимальной конструкции выражения для чтения данных: select <список столбцов> from <список таблиц> Служебная таблица dual как раз и наличествует в системе для формализации выборок "из ниоткуда"...
Поиск по дате на Oracle Задача Имеется таблица изменений курса валют T_CURRENCY: CODE  varchar2(32)  Код валюты (USD, RUR, …) DATE_C date Дата изменения курса VALUE  number Значение курса Необходимо написать SQL запрос, с помощью которого можно получить значение курса для заданной валюты на заданную дату. Решение Создаю структуру CREATE TABLE T_CURRENCY (   CODE VARCHAR2(32),   DATE_C DATE,   VALUE NUMBER ); / Наполняю структуру данными INSERT INTO "T_CURRENCY" (CODE, DATE_C, VALUE) VALUES ('USD', TO_DATE('2019-08-13 16:00:00','YYYY-MM-DD HH24:MI:SS') , 64.760); INSERT INTO "T_CURRENCY" (CODE, DATE_C, VALUE) VALUES ('USD', TO_DATE('2019-08-13 20:00:00','YYYY-MM-DD HH24:MI:SS') , 64.834); INSERT INTO "T_CURRENCY" (CODE, DATE_C, VALUE) VALUES ('USD', TO_DATE('2019-08-14 08:00:00','YYYY-MM-DD HH24:MI:SS') , 65.209); INSERT INTO "T_CURRENCY" (CODE, DATE_C, VALUE) VALUES ('USD', TO_DATE('2019-08-14 12:00:00','YYYY-MM-DD HH24:MI:SS') , 65.460); COMMIT; Проверяю выборку SELECT CODE,    TO_CHAR(DATE_C, 'YYYY-MM-DD HH24:MI:SS') AS DATE_TIME,    VALUE  FROM T_CURRENCY; Вижу CODE DATE_TIME   VALUE USD 2019-08-13 16:00:00 64.76 USD 2019-08-13 20:00:00 64.834 USD 2019-08-14 08:00:00 65.209 USD 2019-08-14 12:00:00 65.46 Для того, чтобы найти курс на указанную дату и время (например, на 2019-08-14 09:45), воспользуемся следующим запросом с подзапросом: SELECT CODE,    TO_CHAR(DATE_C, 'YYYY-MM-DD HH24:MI:SS') AS DATE_TIME,    VALUE FROM T_CURRENCY  WHERE CODE = 'USD'   AND DATE_C IN (    SELECT MAX(DATE_C)    FROM T_CURRENCY    WHERE DATE_C <= TO_DATE('2019-08-14 09:45:00','YYYY-MM-DD HH24:MI:SS')   ); Результат: CODE DATE_TIME   VALUE USD 2019-08-14 08:00:00 65.209