Страница 2 из 4

Re: MSSQL

Добавлено: 15 фев 2005, 23:08
Yury
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 не обязательно возрастает (трудно ожидать от реляционной таблицы упорядоченности), как тогда?

Добавлено: 15 фев 2005, 23:12
CdR
я относился к actual ID number.
Ффуххх, меня попустило, а то я думал, что совсем запутался...

MSSQL

Добавлено: 16 фев 2005, 01:39
Yuri Dimant
CDR,ты абсолютно прав , что если запустить SELECT <col> FROM TABLE
без ORDER BY ты можешь получить uexpected результат.
Другое дело , если есть CLUSTERED INDEX в таблице, то SQL Server сортирует записи (ИНДЕХ page) по полю на котором есть CI.
Я всегда в запросах добаляю ORDER BY.

Добавлено: 16 фев 2005, 05:45
vg
Спасибо, товарищи, что откликнулись.

Речь идёт, как ни странно, имменно о физическом порядке, которого суть нет. Папа и Юрий совершенно правы. Каждый со своей стороны.

Однако я всё ж не знаю получить рекордсет с "физической" упорядоченностью. Прав на мой взгляд Yury - надо получить подзапрос в котором будут пронумерованы строки. Если б надо было решить практическую задачу, то я бы написал простенький код на VB.

Как это сделать в одном выражении SQL? .... А может процедуру писать надо было? ...

Добавлено: 16 фев 2005, 05:52
vg
Yury писал(а):
CdR писал(а):select * from tbl order by Id limit 5,5 ?
или в MSSQL так не модно?
я так понял, имеется в виду физический порядок
иначе уж совсем просто - SELECT с BETWEEN

если физический - я бы создал свременную таблицу с пронумерованными строками (типа http://www.sql.ru/forum/actualthread.as ... 1&tid=9523),
а потом уже запрос к ней

а лимит - не то чтобы не модно, но это нестандартная майсклевская фича (в MS SQL правда и своих нестандартностей хватает)
Да, скорее всего что-то в этом духе надо было б делать.

Добавлено: 16 фев 2005, 09:50
Zy
да по-любому придется сортировать по номеру записи (в оракле это rowid), а потом фетчить.

Кстати, rowid в оракле - это 18-ти значный 16-ричный код, эзначающий смещение на диске в базе (очень грубро говоря), поэтому никаких "1" или "2" у него быть не может.

И вообще, в вопросе сказано "получить". "В одном запросе" - таких слов нет.

Добавлено: 16 фев 2005, 09:58
Zy
А вот ни фига, можно и в одном запросе (по крайней мере в оракле):

CREATE TABLE "tbl"
(
Id INTEGER,
TxtName CHAR(50)
)


select *
from (select * from tbl order by rowid)
where rownum between (5, 10)

Это после беседы с нашим админом + у меня такой вопрос был на экзамене по ораклу.

Добавлено: 16 фев 2005, 10:01
vg
Zy писал(а):да по-любому придется сортировать по номеру записи (в оракле это rowid), а потом фетчить.

Кстати, rowid в оракле - это 18-ти значный 16-ричный код, эзначающий смещение на диске в базе (очень грубро говоря), поэтому никаких "1" или "2" у него быть не может.

И вообще, в вопросе сказано "получить". "В одном запросе" - таких слов нет.
В "одном запросе" - наверное, это я с перепугу так понял того, кто меня интервьюировал.

Добавлено: 16 фев 2005, 10:03
vg
Zy писал(а):да по-любому придется сортировать по номеру записи (в оракле это rowid), а потом фетчить.

Кстати, rowid в оракле - это 18-ти значный 16-ричный код, эзначающий смещение на диске в базе (очень грубро говоря), поэтому никаких "1" или "2" у него быть не может.

И вообще, в вопросе сказано "получить". "В одном запросе" - таких слов нет.
Спасибо. Буду знать про rowid. Не думал, что такое есть в ANSI SQL-92

Добавлено: 16 фев 2005, 10:22
Zy
Спасибо. Буду знать про rowid. Не думал, что такое есть в ANSI SQL-92
Совершенно не факт - оракл клал с прибором на все ansi.

Добавлено: 21 фев 2005, 09:50
Seaman
Не знаю, решили вопрос или нет, но там где в Oracl-e есть rowid, в Access-е подход иной. Я не уверен, если пример Access-а подойдет, но ...
на всякий случай (я так сделал в своей аппликации):
SELECT * FROM (SELECT TOP 5 * FROM table ORDER BY id) ORDER BY id DESC) ORDER BY id ASC;

Добавлено: 21 фев 2005, 10:00
Yury
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

Добавлено: 21 фев 2005, 10:13
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 и попадают.

Добавлено: 21 фев 2005, 10:50
Yury
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 не обязательно возрастает (трудно ожидать от реляционной таблицы упорядоченности), как тогда?

Добавлено: 21 фев 2005, 11:03
папа Карло
я никак не пойму за что борьба идет? надо постраничную выборку сделать? или надо взять записи с 5ой по 10ую в очередности в которой они в таблице хранятся?