Простой вопрос по SQL

Все, что вы хотели знать о программизме, но боялись спросить.
Аватара пользователя
Yury
The L'ony
Сообщения: 26202
Зарегистрирован: 22 янв 2004, 13:48
Откуда: Мирный -> Vancouver
Контактная информация:

Re: MSSQL

Сообщение 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 не обязательно возрастает (трудно ожидать от реляционной таблицы упорядоченности), как тогда?
Аватара пользователя
CdR
Графоман
Сообщения: 11245
Зарегистрирован: 11 окт 2004, 19:27
Откуда: Европа, центр, за углом направо.

Сообщение CdR »

я относился к actual ID number.
Ффуххх, меня попустило, а то я думал, что совсем запутался...
Yuri Dimant
Пользователь
Сообщения: 107
Зарегистрирован: 02 авг 2004, 22:00

MSSQL

Сообщение Yuri Dimant »

CDR,ты абсолютно прав , что если запустить SELECT <col> FROM TABLE
без ORDER BY ты можешь получить uexpected результат.
Другое дело , если есть CLUSTERED INDEX в таблице, то SQL Server сортирует записи (ИНДЕХ page) по полю на котором есть CI.
Я всегда в запросах добаляю ORDER BY.
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Сообщение vg »

Спасибо, товарищи, что откликнулись.

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

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

Как это сделать в одном выражении SQL? .... А может процедуру писать надо было? ...
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Сообщение 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 правда и своих нестандартностей хватает)
Да, скорее всего что-то в этом духе надо было б делать.
Zy
Маньяк
Сообщения: 4706
Зарегистрирован: 20 янв 2005, 19:11

Сообщение Zy »

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

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

И вообще, в вопросе сказано "получить". "В одном запросе" - таких слов нет.
Zy
Маньяк
Сообщения: 4706
Зарегистрирован: 20 янв 2005, 19:11

Сообщение Zy »

А вот ни фига, можно и в одном запросе (по крайней мере в оракле):

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


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

Это после беседы с нашим админом + у меня такой вопрос был на экзамене по ораклу.
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Сообщение vg »

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

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

И вообще, в вопросе сказано "получить". "В одном запросе" - таких слов нет.
В "одном запросе" - наверное, это я с перепугу так понял того, кто меня интервьюировал.
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Сообщение vg »

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

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

И вообще, в вопросе сказано "получить". "В одном запросе" - таких слов нет.
Спасибо. Буду знать про rowid. Не думал, что такое есть в ANSI SQL-92
Zy
Маньяк
Сообщения: 4706
Зарегистрирован: 20 янв 2005, 19:11

Сообщение Zy »

Спасибо. Буду знать про rowid. Не думал, что такое есть в ANSI SQL-92
Совершенно не факт - оракл клал с прибором на все ansi.
Аватара пользователя
Seaman
Пользователь
Сообщения: 197
Зарегистрирован: 21 фев 2003, 13:26
Откуда: Ессентуки-Нврск-СПб-Торонто

Сообщение Seaman »

Не знаю, решили вопрос или нет, но там где в Oracl-e есть rowid, в Access-е подход иной. Я не уверен, если пример Access-а подойдет, но ...
на всякий случай (я так сделал в своей аппликации):
SELECT * FROM (SELECT TOP 5 * FROM table ORDER BY id) ORDER BY id DESC) ORDER BY id ASC;
Аватара пользователя
Yury
The L'ony
Сообщения: 26202
Зарегистрирован: 22 янв 2004, 13:48
Откуда: Мирный -> Vancouver
Контактная информация:

Сообщение 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
Аватара пользователя
Seaman
Пользователь
Сообщения: 197
Зарегистрирован: 21 фев 2003, 13:26
Откуда: Ессентуки-Нврск-СПб-Торонто

Сообщение 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 и попадают.
Аватара пользователя
Yury
The L'ony
Сообщения: 26202
Зарегистрирован: 22 янв 2004, 13:48
Откуда: Мирный -> Vancouver
Контактная информация:

Сообщение 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 не обязательно возрастает (трудно ожидать от реляционной таблицы упорядоченности), как тогда?
Аватара пользователя
папа Карло
Шарманщик
Сообщения: 8565
Зарегистрирован: 17 фев 2003, 15:04
Откуда: НН -> BC -> WA -> UT -> CA

Сообщение папа Карло »

я никак не пойму за что борьба идет? надо постраничную выборку сделать? или надо взять записи с 5ой по 10ую в очередности в которой они в таблице хранятся?
Ответить