Подкачка страниц с Oracle и SQL-сервером и универсальным методом подкачки страниц

Если вы открыты для использования , то вы можете использовать событие Worksheet_Change для сохранения «Дата / Время изменено» на втором (скрытом) листе, например, так: 110]

Это позволит вам затем включить ваш «табель рабочего времени» в формулу, например так:

=IF(Sheet2!A1 < Sheet2!B1, "First was " & A1 & ", then " & B1, "First was " & B1 & ", then " & A1)

(Очевидно, это лишь грубый пример, и он не учитывает например, когда только в одну из ячеек были введены данные, или очистка дат при удалении данных)

7
задан user59706 28 January 2009 в 20:47
поделиться

6 ответов

Как другие предположили, можно использовать rownum в Oracle. Это немного хитро, хотя и необходимо вложить запрос дважды.

Например, для нумерации страниц запроса

select first_name from some_table order by first_name

необходимо вложить его как это

select first_name from
  (select rownum as rn, first_name from
    (select first_name from some_table order by first_name)
  ) where rn > 100  and rn <= 200

Причина этого состоит в том, что rownum определяется после где пункт и перед порядком пунктом. Для наблюдения, что я имею в виду можно запросить

select rownum,first_name from some_table order by first_name

и Вы могли бы добраться

4   Diane
2   Norm
3   Sam
1   Woody

Поэтому оракул оценивает где пункт (ни один в этом случае), затем присваивает rownums, затем сортирует результаты по first_name. Необходимо вложить запрос, таким образом, он использует rownum, присвоенный после того, как строки были отсортированы.

Второе вложение имеет отношение, как rownum рассматривают в где условие. В основном, если Вы запрашиваете, "где rownum> 100" затем Вы не получаете результатов. Это - вещь курицы и яйца, куда это не может возвратить строки, пока это не находит rownum> 100, но так как это не возвращает строк, это никогда не увеличивает rownum, таким образом, это никогда не рассчитывает к 100. Тьфу. Второй уровень вложения решает это. Обратите внимание, что это должно исказить rownum столбец в этой точке.

Наконец, Ваш порядок пунктом должен сделать запрос детерминированным. Например, если у Вас есть John Doe и John Smith, и Вы заказываете именем только, затем эти два могут переключить места с одного выполнения запроса к следующему.

Существуют статьи здесь http://www.oracle.com/technology/oramag/oracle/06-sep/o56asktom.html и здесь http://www.oracle.com/technology/oramag/oracle/07-jan/o17asktom.html. Теперь, когда я вижу, какой длины мое сообщение, я, вероятно, должен был просто отправить те ссылки...

17
ответ дан 6 December 2019 в 07:28
поделиться

К сожалению, методы для ограничения диапазона строк, возвращенных запросом, варьируются от одного DBMS до другого: Oracle использует ROWNUM (см. ответ ocdecio), но ROWNUM не будет работать в SQL Server.

Возможно, можно инкапсулировать эти различия с функцией, которая берет данный SQL-оператор и первые и последние номера строк и генерирует соответствующий paginatd SQL для целевого DBMS - т.е. что-то как:

sql = paginated ('select empno, ename from emp where job = ?', 101, 150)

который возвратился бы

'select * from (select v.*, ROWNUM rn from ('
 + theSql
 + ') v where rownum < 150) where rn >= 101'

для Oracle и чего-то еще для SQL Server.

Однако обратите внимание, что решение Oracle добавляет новый столбец RN к результатам, с которыми необходимо будет иметь дело.

4
ответ дан 6 December 2019 в 07:28
поделиться

Я полагаю, что у обоих есть аналитическая функция ROWNUM. Используйте это, и Вы будете идентичны.

В Oracle это здесь

ROW_NUMBER

Да, просто проверенный, что ROW_NUMBER является той же функцией в обоих.

1
ответ дан 6 December 2019 в 07:28
поделиться

"Поскольку... данные могут быть изменением от других сессий". Что Вы хотите произойти для этого?

Например, пользователь получает 'последние' десять строк в 10:30.

В 10:31 3 новых строки добавляются (таким образом, те десять, являющиеся представлением пользователем, больше не являются последними).

В 10:32 пользователь запрашивает затем 'следующие' десять записей.

Вы хотите, чтобы тот новый набор включал те три, которые были ударены с 09.08.10 вниз до 12.11.13? В противном случае в Oracle можно выбрать данные, как это было в 10:30

SELECT * FROM table_1 as of timestamp (timestamp '2009-01-29 10:30:00'); 

Вам все еще нужна row_number логика, например,

 select * from
    (SELECT a.*, row_number() over (order by hire_date) rn
    FROM hr.employees as of timestamp (timestamp '2009-01-29 10:30:00') a)
 where rn between 10 and 19
1
ответ дан 6 December 2019 в 07:28
поделиться

Если бы ожидаемый набор данных огромен, я рекомендовал бы составить временную таблицу, представление или снимок (осуществленное представление) для хранения результатов запроса + номер строки, полученный или использующий ROWNUM или аналитическую функцию ROW_NUMBER. После этого можно просто запросить это временное устройство хранения данных с помощью диапазонов номера строки. В основном необходимо разделить фактическую выборку данных из подкачки страниц.

0
ответ дан 6 December 2019 в 07:28
поделиться

Нет никакого универсального способа гарантировать подкачку страниц через различные продукты RDBMS. Oracle дает Вам rownum, как который можно использовать в где пункт:

where rownum < 1000

SQL Server дает Вам row_id () функция, которая может использоваться подобная rownum Oracle. Однако row_id () не доступен перед SQL Server 2005.

0
ответ дан 6 December 2019 в 07:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: