Yuri Dimant писал(а):Yura, there is no need to create a temporay table
CREATE TABLE tbl
(
[Id ]INTEGER primary key,
TxtName CHAR(50) not null
)
INSERT INTO tbl VALUES (1,'John')
INSERT INTO tbl VALUES (2,'Alex')
INSERT INTO tbl VALUES (5,'Bill')
INSERT INTO tbl VALUES (8,'Tom')
INSERT INTO tbl VALUES (10,'DJ')
INSERT INTO tbl VALUES (20,'Paul')
DECLARE @from INT,@to INT
SET @from=1
SET @to=3
SELECT * FROM tbl
WHERE (SELECT COUNT(*) FROM tbl t WHERE t.[id]<=tbl.[id])
BETWEEN @from AND @to
ты это запускал?
а предположим id не обязательно возрастает (трудно ожидать от реляционной таблицы упорядоченности), как тогда?
CDR,ты абсолютно прав , что если запустить SELECT <col> FROM TABLE
без ORDER BY ты можешь получить uexpected результат.
Другое дело , если есть CLUSTERED INDEX в таблице, то SQL Server сортирует записи (ИНДЕХ page) по полю на котором есть CI.
Я всегда в запросах добаляю ORDER BY.
Речь идёт, как ни странно, имменно о физическом порядке, которого суть нет. Папа и Юрий совершенно правы. Каждый со своей стороны.
Однако я всё ж не знаю получить рекордсет с "физической" упорядоченностью. Прав на мой взгляд Yury - надо получить подзапрос в котором будут пронумерованы строки. Если б надо было решить практическую задачу, то я бы написал простенький код на VB.
Как это сделать в одном выражении SQL? .... А может процедуру писать надо было? ...
да по-любому придется сортировать по номеру записи (в оракле это rowid), а потом фетчить.
Кстати, rowid в оракле - это 18-ти значный 16-ричный код, эзначающий смещение на диске в базе (очень грубро говоря), поэтому никаких "1" или "2" у него быть не может.
И вообще, в вопросе сказано "получить". "В одном запросе" - таких слов нет.
Zy писал(а):да по-любому придется сортировать по номеру записи (в оракле это rowid), а потом фетчить.
Кстати, rowid в оракле - это 18-ти значный 16-ричный код, эзначающий смещение на диске в базе (очень грубро говоря), поэтому никаких "1" или "2" у него быть не может.
И вообще, в вопросе сказано "получить". "В одном запросе" - таких слов нет.
В "одном запросе" - наверное, это я с перепугу так понял того, кто меня интервьюировал.
Zy писал(а):да по-любому придется сортировать по номеру записи (в оракле это rowid), а потом фетчить.
Кстати, rowid в оракле - это 18-ти значный 16-ричный код, эзначающий смещение на диске в базе (очень грубро говоря), поэтому никаких "1" или "2" у него быть не может.
И вообще, в вопросе сказано "получить". "В одном запросе" - таких слов нет.
Спасибо. Буду знать про rowid. Не думал, что такое есть в ANSI SQL-92
Не знаю, решили вопрос или нет, но там где в Oracl-e есть rowid, в Access-е подход иной. Я не уверен, если пример Access-а подойдет, но ...
на всякий случай (я так сделал в своей аппликации):
SELECT * FROM (SELECT TOP 5 * FROM table ORDER BY id) ORDER BY id DESC) ORDER BY id ASC;
Seaman писал(а):Не знаю, решили вопрос или нет, но там где в Oracl-e есть rowid, в Access-е подход иной. Я не уверен, если пример Access-а подойдет, но ...
на всякий случай (я так сделал в своей аппликации):
SELECT * FROM (SELECT TOP 5 * FROM table ORDER BY id) ORDER BY id DESC) ORDER BY id ASC;
и как это решает поставленную задачу?
Btw, лишний ORDER или не хватает еще одного SELECT
SELECT * FROM (SELECT TOP 5 * FROM (SELECT TOP 10 * FROM table ORDER BY id) ORDER BY id DESC) ORDER BY id ASC;
Нам надо получить записи с 5-й по 10-ю, обращаем внимание, что id при этом = 11 и 20. В первую голову она (БД) выбирает первые 10 записей (1 - 10), потом она их переворачивает и снова выбирает первые 5 записей, но теперь с конца (10 - 5), после этого мы их ставим в правильном порядке (5-10), куда как раз эти id = 11 и id=20 и попадают.
Seaman писал(а):Да да да, простите, пропустил еще один SELECT:
SELECT * FROM (SELECT TOP 5 * FROM (SELECT TOP 10 * FROM table ORDER BY id) ORDER BY id DESC) ORDER BY id ASC;
Нам надо получить записи с 5-й по 10-ю, обращаем внимание, что id при этом = 11 и 20. В первую голову она (БД) выбирает первые 10 записей (1 - 10), потом она их переворачивает и снова выбирает первые 5 записей, но теперь с конца (10 - 5), после этого мы их ставим в правильном порядке (5-10), куда как раз эти id = 11 и id=20 и попадают.
Ok, this is the same question I asked Yuri Dimant:
а, предположим, id не обязательно возрастает (трудно ожидать от реляционной таблицы упорядоченности), как тогда?
я никак не пойму за что борьба идет? надо постраничную выборку сделать? или надо взять записи с 5ой по 10ую в очередности в которой они в таблице хранятся?