Вставить во временные значения (выберите ... упорядочить по идентификатору)

StackOverflow https://stackoverflow.com/questions/263101

  •  06-07-2019
  •  | 
  •  

Вопрос

Я использую базу данных 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top