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

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

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

Сообщение vg »

Есть таблица, например,
CREATE TABLE "tbl"
(
Id INTEGER,
TxtName CHAR(50)
)

Id - 1,2,5,10,11,20. Т.е. не обязательно последовательность. Про уникальность тоже не знаю. Подозреваю, что таблица лежит на MSSQL Server.

Мне задали на интервью вопрос - как получить набор записей, включающий записи с 5 по 10.

Т.е. чтобы в наборе мы получили:

id = 11, TxtName = "kjsdfskjf"
id = 20, TxtName = "reworumcnc"

...
Аватара пользователя
CdR
Графоман
Сообщения: 11245
Зарегистрирован: 11 окт 2004, 19:27
Откуда: Европа, центр, за углом направо.

Сообщение CdR »

select * from tbl order by Id limit 5,5 ?
или в MSSQL так не модно?
Аватара пользователя
Yury
The L'ony
Сообщения: 26202
Зарегистрирован: 22 янв 2004, 13:48
Откуда: Мирный -> Vancouver
Контактная информация:

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

Сообщение CdR »

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

Сообщение Yury »

CdR писал(а):исходные вопрос не совсем определенный, мы поняли по-разному немного, но наверное это фича вопроса?
наверное, или бага его пересказа :wink:

хотя судя по примеру ответа - там именно физический порядок имеется в виду, ладно завтра вг прояснит
Аватара пользователя
CdR
Графоман
Сообщения: 11245
Зарегистрирован: 11 окт 2004, 19:27
Откуда: Европа, центр, за углом направо.

Сообщение CdR »

Ну, с физическим порядком -- просто order убрать...
хмм. если б я еще mssql в глаза хоть раз видел! :)
А sequence какой-то прямо в select поставить нельзя, а потом по нему ограничится?
Ты с between это имел ввиду?
Аватара пользователя
папа Карло
Шарманщик
Сообщения: 8565
Зарегистрирован: 17 фев 2003, 15:04
Откуда: НН -> BC -> WA -> UT -> CA

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

1ое в реляционной модели порядка записей нет. но если хотят получить все записи у которых ИД между 5 и 11, то например так....

select * from table where id > 5 and id < 11
Yuri Dimant
Пользователь
Сообщения: 107
Зарегистрирован: 02 авг 2004, 22:00

MSSQL

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

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=5
SELECT * FROM tbl WHERE [id] BETWEEN @from AND @to
---Or
SELECT * FROM tbl WHERE [id] >= @from AND [id] <=@to
GO
DROP TABLE tbl
Yuri Dimant
Пользователь
Сообщения: 107
Зарегистрирован: 02 авг 2004, 22:00

MSSQL

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

Папа.
В твоем ответе ресултат не включает запись 1 и 5.Правда, автор не пояснил конкретно, что он хочет видеть

Можно написать SELECT <column lists> FROM table WHERE id >=1 AND id <5+1
Oчень еффективно работать с datetime , если поле содержит время
'20050101 10:00:00' :lol:
Yuri Dimant
Пользователь
Сообщения: 107
Зарегистрирован: 02 авг 2004, 22:00

MSSQL

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

Sorry , I was about to say , (5 and 11)
Аватара пользователя
Yury
The L'ony
Сообщения: 26202
Зарегистрирован: 22 янв 2004, 13:48
Откуда: Мирный -> Vancouver
Контактная информация:

Сообщение Yury »

CdR писал(а):Ну, с физическим порядком -- просто order убрать...
хмм. если б я еще mssql в глаза хоть раз видел! :)
А sequence какой-то прямо в select поставить нельзя, а потом по нему ограничится?
Ты с between это имел ввиду?
насчет sequence - может как нибудь и можно, я пока не нашел как это сделать в одном запросе не пересортируя данные, я имел в виду создать временную таблицу с полем порядкового номера
что-то типа:

BEGIN
select identity(int,1,1) counter ,* into #temp from tbl
select * from #temp where counter between 5 and 10
drop table #temp
END
Аватара пользователя
Yury
The L'ony
Сообщения: 26202
Зарегистрирован: 22 янв 2004, 13:48
Откуда: Мирный -> Vancouver
Контактная информация:

Сообщение Yury »

папа Карло писал(а):1ое в реляционной модели порядка записей нет. но если хотят получить все записи у которых ИД между 5 и 11, то например так....

select * from table where id > 5 and id < 11
в модели нет - в таблицах есть :)
не могу, правда, себе представить рабочую ситуацию, когда бы мне это нужно было, хотя есть софт, очень известный, который это использует - для быстроты? - но уж лучше бы этого не делал (подписи на карте привязаны к графическим объектам по физическому номеру записи - и после удаления записей, точнее после упаковки таблиц с удаленными записями - все связи летят к чертям (типа москва становится жмеринкой, медь алюминием и т.п.)
Аватара пользователя
Yury
The L'ony
Сообщения: 26202
Зарегистрирован: 22 янв 2004, 13:48
Откуда: Мирный -> Vancouver
Контактная информация:

Re: MSSQL

Сообщение Yury »

Yuri Dimant писал(а):Папа.
В твоем ответе ресултат не включает запись 1 и 5.Правда, автор не пояснил конкретно, что он хочет видеть

Можно написать SELECT <column lists> FROM table WHERE id >=5 AND id <10+1
Oчень еффективно работать с datetime , если поле содержит время
'20050101 10:00:00' :lol:
почему не пояснил? - по его словам должно получиться
id = 11,
id = 20,

твой селект вернет

id = 5,
id = 10,

да и тривиально это было бы, разве что на очень джуниор позицию :)
Yuri Dimant
Пользователь
Сообщения: 107
Зарегистрирован: 02 авг 2004, 22:00

MSSQL

Сообщение 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
Yuri Dimant
Пользователь
Сообщения: 107
Зарегистрирован: 02 авг 2004, 22:00

MSSQL

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

юра ты прав, я относился к actual ID number.
Ответить