Вставить во временные значения (выберите ... упорядочить по идентификатору)
Вопрос
Я использую базу данных Informix (версия 7.32).При одной операции я создаю временную таблицу с идентификатором обычной таблицы и последовательным столбцом (таким образом, у меня были бы все идентификаторы из обычной таблицы, пронумерованные непрерывно).Но я хочу вставить информацию из обычной таблицы, упорядоченной по идентификатору, что-то вроде:
CREATE TEMP TABLE tempTable (id serial, folio int );
INSERT INTO tempTable(id,folio)
SELECT 0,folio FROM regularTable ORDER BY folio;
Но это создает синтаксическую ошибку (из-за ПОРЯДКА BY)
Есть ли какой-нибудь способ, которым я могу заказать информацию, а затем вставить ее во временную таблицу?
Обновить:Причина, по которой я хочу это сделать, заключается в том, что обычная таблица содержит около 10 000 элементов, а в файле jsp она должна отображать каждую запись, но это займет много времени, поэтому реальная причина, по которой я хочу это сделать, заключается в том, чтобы разбить на страницы результат.Эта версия Informix не имеет Limit
ни Skip
.Я не могу перенумеровать серийный номер, потому что он связан, и это единственное решение, с помощью которого мы могли бы получить фиксированное количество результатов на одной странице (например, 500 результатов на страницу).В обычной таблице пропущены идентификаторы (называемые folio), потому что они были удалены.если бы я должен был поставить
SELECT * FROM regularTable WHERE folio BETWEEN X AND Y
Я бы получил, может быть, 300 на одной странице, затем 500 на следующей
Решение
Вы можете попробовать перебрать курсор над SELECT ... ORDER BY и выполнить INSERT внутри цикла.
Другие советы
Вы можете сделать это, разбив SQL на две временные таблицы:
CREATE TEMP TABLE tempTable1 (
id serial,
folio int);
SELECT folio FROM regularTable ORDER BY folio
INTO TEMP tempTable2;
INSERT INTO tempTable1(id,folio) SELECT 0,folio FROM tempTable2;
В Informix при использовании SELECT в качестве подпункта в инструкции INSERT вы ограничено подмножеством синтаксиса SELECT.
Следующие предложения SELECT в этом случае не поддерживаются:
- В ТЕМП
- ЗАКАЗАТЬ ПО
- ПРОФСОЮЗ.
Кроме того, предложение FROM в SELECT не может ссылаться на ту же таблицу, на которую ссылается ВСТАВКА (не то чтобы это имело значение в вашем случае).
Прошло много лет с тех пор, как я работал над Informix, но, возможно, что-то вроде этого будет работать:
INSERT INTO tempTable(id,folio)
SELECT 0, folio
FROM (
SELECT folio FROM regularTable ORDER BY folio
);
Нет смысла упорядочивать строки при вставке в таблицу. Реляционные базы данных не позволяют указывать порядок строк в таблице. Р>
Даже если бы вы могли, SQL не гарантирует, что запрос будет возвращать строки в любом порядке, например, в порядке их вставки. Вы должны указать предложение ORDER BY
, чтобы гарантировать порядок для результата запроса. Р>
Так что не стоит менять порядок вставки строк.
Как сказал Билл, упорядочение ввода не имеет большого смысла, вам действительно нужно упорядочить вывод. В приведенном вами упрощенном примере это просто не имеет смысла, поэтому я могу только предположить, что реальная проблема, которую вы пытаетесь решить, более сложна - возможно, дедупликация?
Вам нужна функция CREATE SEQUENCE
, но я уверен, что она недоступна в такой старой версии Informix.
Если вам действительно нужно выполнить то, что вы просите, вы можете посмотреть UNLOAD
в нужном порядке, а затем снова LOAD
. Это обеспечит последовательное распределение значений SERIAL.
Хотелось бы что-нибудь подобное?
SELECT
folio
FROM
(
SELECT
ROWNUM n,
folio
FROM
regularTable
ORDER BY
folio
)
WHERE
n BETWEEN 501 AND 1000
Это может быть не очень эффективно, если таблица увеличивается или вы загружаете позже "страницы", но 10K строк довольно мало.
Я не помню, если у Informix есть концепция ROWNUM, я использую Oracle.