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

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

Добавлено: 15 фев 2005, 20:15
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"

...

Добавлено: 15 фев 2005, 20:23
CdR
select * from tbl order by Id limit 5,5 ?
или в MSSQL так не модно?

Добавлено: 15 фев 2005, 20:38
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 правда и своих нестандартностей хватает)

Добавлено: 15 фев 2005, 20:46
CdR
исходные вопрос не совсем определенный, мы поняли по-разному немного, но наверное это фича вопроса?

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

хотя судя по примеру ответа - там именно физический порядок имеется в виду, ладно завтра вг прояснит

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

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

select * from table where id > 5 and id < 11

MSSQL

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

MSSQL

Добавлено: 15 фев 2005, 21:44
Yuri Dimant
Папа.
В твоем ответе ресултат не включает запись 1 и 5.Правда, автор не пояснил конкретно, что он хочет видеть

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

MSSQL

Добавлено: 15 фев 2005, 21:46
Yuri Dimant
Sorry , I was about to say , (5 and 11)

Добавлено: 15 фев 2005, 22:45
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

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

select * from table where id > 5 and id < 11
в модели нет - в таблицах есть :)
не могу, правда, себе представить рабочую ситуацию, когда бы мне это нужно было, хотя есть софт, очень известный, который это использует - для быстроты? - но уж лучше бы этого не делал (подписи на карте привязаны к графическим объектам по физическому номеру записи - и после удаления записей, точнее после упаковки таблиц с удаленными записями - все связи летят к чертям (типа москва становится жмеринкой, медь алюминием и т.п.)

Re: MSSQL

Добавлено: 15 фев 2005, 22:58
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,

да и тривиально это было бы, разве что на очень джуниор позицию :)

MSSQL

Добавлено: 15 фев 2005, 22:58
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

MSSQL

Добавлено: 15 фев 2005, 23:00
Yuri Dimant
юра ты прав, я относился к actual ID number.