Простой вопрос по SQL
Правила форума
Пожалуйста, ознакомьтесь с правилами данного форума
Пожалуйста, ознакомьтесь с правилами данного форума
-
- Маньяк
- Сообщения: 2803
- Зарегистрирован: 29 май 2003, 22:29
- Откуда: Магадан - Миссиссага
Простой вопрос по SQL
Есть таблица, например,
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"
...
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
- Откуда: Европа, центр, за углом направо.
- Yury
- The L'ony
- Сообщения: 26202
- Зарегистрирован: 22 янв 2004, 13:48
- Откуда: Мирный -> Vancouver
- Контактная информация:
я так понял, имеется в виду физический порядок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
- Откуда: Европа, центр, за углом направо.
- Yury
- The L'ony
- Сообщения: 26202
- Зарегистрирован: 22 янв 2004, 13:48
- Откуда: Мирный -> Vancouver
- Контактная информация:
- CdR
- Графоман
- Сообщения: 11245
- Зарегистрирован: 11 окт 2004, 19:27
- Откуда: Европа, центр, за углом направо.
- папа Карло
- Шарманщик
- Сообщения: 8565
- Зарегистрирован: 17 фев 2003, 15:04
- Откуда: НН -> BC -> WA -> UT -> CA
-
- Пользователь
- Сообщения: 107
- Зарегистрирован: 02 авг 2004, 22:00
MSSQL
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
(
[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
-
- Пользователь
- Сообщения: 107
- Зарегистрирован: 02 авг 2004, 22:00
MSSQL
Папа.
В твоем ответе ресултат не включает запись 1 и 5.Правда, автор не пояснил конкретно, что он хочет видеть
Можно написать SELECT <column lists> FROM table WHERE id >=1 AND id <5+1
Oчень еффективно работать с datetime , если поле содержит время
'20050101 10:00:00'
В твоем ответе ресултат не включает запись 1 и 5.Правда, автор не пояснил конкретно, что он хочет видеть
Можно написать SELECT <column lists> FROM table WHERE id >=1 AND id <5+1
Oчень еффективно работать с datetime , если поле содержит время
'20050101 10:00:00'

-
- Пользователь
- Сообщения: 107
- Зарегистрирован: 02 авг 2004, 22:00
MSSQL
Sorry , I was about to say , (5 and 11)
- Yury
- The L'ony
- Сообщения: 26202
- Зарегистрирован: 22 янв 2004, 13:48
- Откуда: Мирный -> Vancouver
- Контактная информация:
насчет sequence - может как нибудь и можно, я пока не нашел как это сделать в одном запросе не пересортируя данные, я имел в виду создать временную таблицу с полем порядкового номераCdR писал(а):Ну, с физическим порядком -- просто order убрать...
хмм. если б я еще mssql в глаза хоть раз видел!
А sequence какой-то прямо в select поставить нельзя, а потом по нему ограничится?
Ты с between это имел ввиду?
что-то типа:
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
- Контактная информация:
в модели нет - в таблицах естьпапа Карло писал(а):1ое в реляционной модели порядка записей нет. но если хотят получить все записи у которых ИД между 5 и 11, то например так....
select * from table where id > 5 and id < 11

не могу, правда, себе представить рабочую ситуацию, когда бы мне это нужно было, хотя есть софт, очень известный, который это использует - для быстроты? - но уж лучше бы этого не делал (подписи на карте привязаны к графическим объектам по физическому номеру записи - и после удаления записей, точнее после упаковки таблиц с удаленными записями - все связи летят к чертям (типа москва становится жмеринкой, медь алюминием и т.п.)
- Yury
- The L'ony
- Сообщения: 26202
- Зарегистрирован: 22 янв 2004, 13:48
- Откуда: Мирный -> Vancouver
- Контактная информация:
Re: MSSQL
почему не пояснил? - по его словам должно получитьсяYuri Dimant писал(а):Папа.
В твоем ответе ресултат не включает запись 1 и 5.Правда, автор не пояснил конкретно, что он хочет видеть
Можно написать SELECT <column lists> FROM table WHERE id >=5 AND id <10+1
Oчень еффективно работать с datetime , если поле содержит время
'20050101 10:00:00'
id = 11,
id = 20,
твой селект вернет
id = 5,
id = 10,
да и тривиально это было бы, разве что на очень джуниор позицию

-
- Пользователь
- Сообщения: 107
- Зарегистрирован: 02 авг 2004, 22:00
MSSQL
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
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
-
- Пользователь
- Сообщения: 107
- Зарегистрирован: 02 авг 2004, 22:00
MSSQL
юра ты прав, я относился к actual ID number.