|
Программирование >> Преобразование значений null
12 3000 13 3000 14 5000 Когда каждой заработной плате поставлен в соответствие порядковый номер, остается просто выбирать необходимый диапазон строк, задавая значения RN. Для пользователей Oracle существует альтернативный вариант: для формирования последовательности номеров строк вместо функции ROW NUMBER OVER можно использовать функцию ROWNUM: select sal from ( select sal, rownum rn from ( select sal from emp order by sal ) ) where rn between 6 and 10 1300 1500 1600 2450 2850 Применение ROWNUM вынуждает создавать дополнительный подзапрос. Самый внутренний подзапрос сортирует строки соответственно размеру заработной платы. Следующий подзапрос присваивает этим строкам порядковые номера. И, наконец, самый внешний SELECT возвращает запрашиваемые данные. MySQL и PostgreSQL Введение в конструкцию SELECT оператора OFFSET делает перемещение по результатам простой и понятной задачей. Если задать OFFSET равным 0, результаты будут выводиться, начиная с первой строки; если OFFSET равен 5 - с шестой строки; и если OFFSET равен 10 - с одиннадцатой строки. Оператор LIMIT ограничивает число возвращаемых строк. Сочетая эти два оператора, можно задавать, с какой строки и сколько строк результирующего множества должно быть возвращено. Как пропустить n строк таблицы Задача Требуется в результате запроса возвратить служащих из таблицы EMP через одного; т. е. необходимо получить записи для первого, третьего, ADAMS BLAKE FORD JONES MARTIN SCOTT TURNER Решение Чтобы пропустить вторую, или четвертую, или и-ную строку результирующего множества, необходимо упорядочить его, в противном случае для множества не существует понятия первой, следующей, второй или четвертой строки. DB2, Oracle и SQL Server Применяя функцию ROW NUMBER OVER, пронумеруйте строки, тогда с помощью функции вычисления остатка от деления можно будет пропускать некоторые из них. В DB2 и Oracle функцией вычисления остатка от деления является функция MOD. В SQL Server используется оператор %. В следующем примере с помощью оператора MOD будут пропущены строки под четными номерами: 1 select ename 2 from ( 3 select row number() over (order by ename) rn, 4 ename пятого служащего и т. д. Например, из следующего результирующего множества: ENAME ADAMS ALLEN BLAKE CLARK FORD JAMES JONES KING MARTIN MILLER SCOTT SMITH TURNER WARD мы должны получить: ENAME
Последний шаг - просто, используя функцию вычисления остатка от деления, пропустить каждую вторую строку. 5 from emp 6 ) x 7 where mod(rn,2) = 1 MySQL и PostgreSQL Поскольку в этих СУБД нет встроенных функций, реализующих ранжирование или нумерование строк, расположить строки в определенном порядке (в данном примере по именам) поможет скалярный подзапрос. Затем пропустите строки, используя остаток от деления: 1 select x.ename 2 from ( 3 select a.ename, 4 (select count(*) 5 from emp b 6 where b.ename <= a.ename) as rn 7 from emp a 8 ) x 9 where mod(x.rn,2) = 1 Обсуждение DB2, Oracle и SQL Server Вызов ранжирующей функции ROW NUMBER OVER во вложенном запросе Х обеспечивает присвоение ранга каждой строке (никаких связей даже между дублирующимися именами). Результаты показаны ниже: select row number() over (order by ename) rn, ename
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |