Номера строк для запроса в informix

#database #informix #row-number

Вопрос:

Я использую базу данных informix, мне нужен запрос, в котором вы также могли бы сгенерировать номер строки вместе с запросом

Нравится

 select row_number(),firstName,lastName 
from students;

row_number() firstName lastName
1            john      mathew
2            ricky     pointing
3            sachin    tendulkar
 

Здесь имя, фамилия взяты из базы данных, где в качестве номера строки генерируется запрос.

Комментарии:

1. Вежливо выбрать ответ — или, если на ваш вопрос ничего не отвечает, разумно отредактировать ваш вопрос, чтобы его можно было понять. Вы должны стремиться выбрать лучший ответ — пожалуйста.

Ответ №1:

Лучший способ-использовать (недавно инициализированную) последовательность.

 begin work;
create sequence myseq;
select myseq.nextval,s.firstName,s.lastName from students s;
drop sequence myseq;
commit work;
 

Ответ №2:

Возможно, вы не сможете использовать ROWID в таблице, фрагментированной по нескольким пространствам баз данных, поэтому любое решение, использующее ROWID, не является особенно переносимым. Это также настоятельно не рекомендуется.

Если у вас нет столбца SERIAL в исходной таблице (что является лучшим способом реализации этой общей концепции), посмотрите на CREATE SEQUENCE, которая более или менее эквивалентна функции Orrible, которая генерирует уникальные номера при выборе из (в отличие от SERIAL, которая генерирует уникальный номер при вставке строки).

Комментарии:

1. примечание: СЕРИЙНЫЙ номер в ifx (по крайней мере) 9, 10 и 11 по умолчанию не уникален. Он обернется вокруг 1.

Ответ №3:

Дана таблица под названием Table3 с 3 столбцами:

 colnum  name   datatype
======= =====  ===
1       no     text;
2       seq    number;
3       nm     text;
 

записка:
seq-это поле в таблице, имеющее уникальные значения в порядке возрастания. Числа не обязательно должны быть смежными.

Вот запрос для возврата номера строки (RowNum) вместе с результатом запроса

 SELECT table3.no, table3.seq, Table3.nm,
      (SELECT COUNT(*) FROM Table3 AS Temp
         WHERE Temp.seq < Table3.seq)   1 AS RowNum
    FROM Table3;
 

Комментарии:

1. Форматирование здесь оставляет желать лучшего. Чтобы получить пример материала постоянной ширины, сделайте отступы, например, в строке «тип данных имени столбца», с отступом в 4 пробела. Оставьте отступы для обычного текста меньше.

Ответ №4:

Я думаю, что самым простым способом было бы использовать следующий код и соответствующим образом настроить его возврат. ВЫБЕРИТЕ идентификатор строки, * ИЗ таблицы

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

P.S. это принятый ответ от экспертов Биржи.

Комментарии:

1. Не могу увидеть «принятый ответ» без подписки, что, даже если бесплатно, по крайней мере неприятно.

Ответ №5:

выберите сумму(1) по (порядку по идентификатору строки) в качестве номера строки, M.* из системных таблиц M

Ответ №6:

Я знаю, что это старый вопрос, но так как я только что столкнулся с этой проблемой и получил сообщение, не упомянутое здесь, я хотел бы поделиться им, так что вот оно:

1 — Вам нужно создать ФУНКЦИЮ, которая возвращает числа в заданном диапазоне:

 CREATE FUNCTION fnc_numbers_in_range (pMinNumber INT, pMaxNumber INT)
RETURNING INT as NUMERO;
DEFINE numero INT;
LET numero = 0;
FOR numero = pMinNumber TO pMaxNumber   
    RETURN numero WITH RESUME;  
END FOR;    
END FUNCTION; 
 

2 — Вы сопоставляете результаты этой функции с нужной таблицей:

 SELECT * FROM TABLE (fnc_numbers_in_range(0,10000)), my_table;
 

Единственное, что вы должны заранее знать количество строк, которые вы хотите, вы можете получить это с помощью функции COUNT (*).

Это работает с моей базой данных Informix, другие реализации могут потребовать некоторой настройки.

Ответ №7:

Используя выражения OLAP, вам нужна функция OVER() с чем-то в ней, так как вы не хотите включать в себя предложение СОРТИРОВКИ, как это:

 SELECT ROW_NUMBER() OVER(ORDER BY lastName, firstName) AS rn, firstName, lastName 
 

ОТ студентов;

и если вы не хотите заказывать по имени, вы можете использовать способ ввода записей в систему, заказав по ROWID.

Комментарии:

1. Он работает только в версии 11.7 и выше