Вставьте в временные значения (выберите .... упорядочить по идентификатору) - PullRequest
3 голосов
/ 04 ноября 2008

Я использую БД Informix (Версия 7.32). В одной операции я создаю временную таблицу с идентификатором обычной таблицы и последовательным столбцом (так, чтобы все идентификаторы из обычной таблицы были пронумерованы непрерывно). Но я хочу вставить информацию из обычной таблицы, упорядоченной по идентификатору, что-то вроде:

CREATE TEMP TABLE tempTable (id serial, folio int );

INSERT INTO tempTable(id,folio)
SELECT 0,folio FROM regularTable ORDER BY folio;

Но это создает синтаксическую ошибку (из-за ORDER BY)

Можно ли как-то заказать информацию и вставить ее в tempTable?

ОБНОВЛЕНИЕ: причина, по которой я хочу это сделать, состоит в том, что обычная таблица содержит около 10000 элементов и в файле jsp должна отображать каждую запись, но это займет много времени, поэтому реальная причина, по которой я хочу это сделать это paginate выход. Эта версия Informix не имеет ни Limit, ни Skip. Я не могу перенумеровать серийный номер, потому что он находится в отношениях, и это единственное решение, на котором мы могли бы получить фиксированное количество результатов на одной странице (например, 500 результатов на страницу). В обычной таблице пропущены идентификаторы (называемые фолио), поскольку они были удалены. если бы я положил

SELECT * FROM regularTable WHERE folio BETWEEN X AND Y

Я бы получил, возможно, 300 на одной странице, затем 500 на следующей странице

Ответы [ 7 ]

3 голосов
/ 02 мая 2011

Вы можете сделать это, разбив 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;
2 голосов
/ 04 ноября 2008

В Informix при использовании SELECT в качестве подпункта в инструкции INSERT вы ограничены к подмножеству синтаксиса SELECT .

В этом случае не поддерживаются следующие предложения SELECT:

  • В ТЕМП.
  • ЗАКАЗАТЬ НА
  • UNION.

Кроме того, предложение FROM в SELECT не может ссылаться на ту же таблицу, на которую ссылается INSERT (не то, что это имеет значение в вашем случае).

0 голосов
/ 05 ноября 2008

Хотелось бы что-нибудь подобное?

SELECT
    folio
FROM
    (
        SELECT
            ROWNUM n,
            folio
        FROM
            regularTable
        ORDER BY 
            folio
    )
WHERE
    n BETWEEN 501 AND 1000

Это может быть не очень эффективно, если таблица увеличивается или вы выбираете более поздние "страницы", но строки размером 10 КБ довольно малы.

Не помню, если у Informix есть концепция ROWNUM, я использую Oracle.

0 голосов
/ 05 ноября 2008

Как сказал Билл, упорядочение ввода не имеет большого смысла, вам действительно нужно упорядочить вывод. В приведенном вами упрощенном примере это просто не имеет смысла, поэтому я могу только предположить, что реальная проблема, которую вы пытаетесь решить, более сложна - возможно, дедупликация?

Функциональность, к которой вы стремитесь, равна CREATE SEQUENCE, но я уверен, что она недоступна в такой старой версии Informix.

Если вам действительно нужно сделать то, что вы просите, вы можете просмотреть UNLOAD данные в нужном порядке, а затем LOAD снова. Это обеспечит последовательное распределение значений SERIAL.

0 голосов
/ 05 ноября 2008

Нет смысла упорядочивать строки при вставке в таблицу. Реляционные базы данных не позволяют указывать порядок строк в таблице.

Даже если бы вы могли, SQL не гарантирует, что запрос вернет строки в любом порядке, например, в порядке их вставки. Вы должны указать предложение ORDER BY, чтобы гарантировать порядок для результата запроса.

Так что не стоит менять порядок вставки строк.

0 голосов
/ 04 ноября 2008

Прошло много лет с тех пор, как я работал над Informix, но, возможно, что-то вроде этого будет работать:

INSERT INTO tempTable(id,folio)
SELECT 0, folio 
FROM (
    SELECT folio FROM regularTable ORDER BY folio
);
0 голосов
/ 04 ноября 2008

Вы можете попробовать перебрать курсор над SELECT ... ORDER BY и выполнить INSERT внутри цикла.

...