Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Astaroth
Зарегистрирован: 17.05.2004 Сообщения: 453 Откуда: Питер
|
Добавлено: Пт Май 28 2004 09:52 Заголовок сообщения: Разминка для мозгов |
|
|
Друг тут подкинул задачку, как я понял из разряда теоретических. Ну, вроде "как обменять переменные значениями без помощи третьей переменной?" Задачка такова:
есть в базе данных табличка, на ней висит примари кей. Количество и тип столбцов не указаны. Как при помощи стандартного SQL пронумеровать строки одним select'ом? Сиквенции и прочие приблуды SQL Plus не предлагать. Решение должно быть при помощи стандартных функций - count, min, max и т.д..
Интересно до жути как такое сделать, а самому не додуматься _________________ Не очеловечивайте компы - они этого не любят! |
|
Вернуться к началу |
|
|
cerber
Зарегистрирован: 19.12.2003 Сообщения: 296 Откуда: Казахстан, Актюбинск
|
Добавлено: Пт Май 28 2004 12:02 Заголовок сообщения: |
|
|
Курсоры пользовать можно? |
|
Вернуться к началу |
|
|
Astaroth
Зарегистрирован: 17.05.2004 Сообщения: 453 Откуда: Питер
|
Добавлено: Пт Май 28 2004 12:04 Заголовок сообщения: |
|
|
Не-а. Ничего низя - только стандартные ф-ции типа указанных выше.
ЗЫ Этот гад как задал задачку, так все никак и не расколется Но божиться что решение есть. _________________ Не очеловечивайте компы - они этого не любят! |
|
Вернуться к началу |
|
|
cerber
Зарегистрирован: 19.12.2003 Сообщения: 296 Откуда: Казахстан, Актюбинск
|
Добавлено: Пт Май 28 2004 12:28 Заголовок сообщения: |
|
|
Цитата: |
Не-а. Ничего низя - только стандартные ф-ции типа указанных выше.
|
т.е. Пронумеровать строки используя только select и стандартные агрегатные функции. |
|
Вернуться к началу |
|
|
Astaroth
Зарегистрирован: 17.05.2004 Сообщения: 453 Откуда: Питер
|
Добавлено: Пт Май 28 2004 12:37 Заголовок сообщения: |
|
|
cerber писал(а): | Цитата: |
Не-а. Ничего низя - только стандартные ф-ции типа указанных выше.
|
т.е. Пронумеровать строки используя только select и стандартные агрегатные функции. |
Именно так. _________________ Не очеловечивайте компы - они этого не любят! |
|
Вернуться к началу |
|
|
Гость
|
Добавлено: Пн Май 31 2004 18:06 Заголовок сообщения: |
|
|
А что значит "пронумеровать строки одним select'ом" ?
получить что то вроде этого?
1 key_value field1_value field2_value ....
2 key_value field1_value field2_value ....
3 key_value field1_value field2_value ....
тогда такой вариант...
Код: | select rowid, t.* from table t; |
или я совсем не туда? |
|
Вернуться к началу |
|
|
Гость
|
Добавлено: Пн Май 31 2004 18:08 Заголовок сообщения: |
|
|
спутал...
Код: | SELECT ROWNUM, t.* FROM table t; |
|
|
Вернуться к началу |
|
|
wildwind
Зарегистрирован: 03.02.2004 Сообщения: 268 Откуда: Москва
|
Добавлено: Вт Июн 01 2004 00:36 Заголовок сообщения: Re: Разминка для мозгов |
|
|
1. У нас все-таки Oracle или ANSI SQL?
2. Astaroth писал(а): | есть в базе данных табличка, на ней висит примари кей. | Это значит, что строки уже пронумерованы!
Или primary key не числовой (тогда какой)?
3. Чем надо пронумеровать? Последовательными целыми числами или любыми уникальными? |
|
Вернуться к началу |
|
|
Astaroth
Зарегистрирован: 17.05.2004 Сообщения: 453 Откуда: Питер
|
Добавлено: Вт Июн 01 2004 09:07 Заголовок сообщения: |
|
|
У нас "чистый" SQL - т.е. все что придумал Oracle и иже с ним не пойдет. Стандарт SQL92, а rownum в нем нету насколько я помню.
Первичный ключ на табличке висит, но какой - Х его З, может и не числовой.
А пронумеровать строки надо по порядку - 1,2,3,4,..., n _________________ Не очеловечивайте компы - они этого не любят! |
|
Вернуться к началу |
|
|
Demiurge
Зарегистрирован: 05.04.2004 Сообщения: 33 Откуда: Казахстан, Астана
|
Добавлено: Вт Июн 01 2004 13:14 Заголовок сообщения: |
|
|
А что, тут сложного - обычный коррелированный подзапрос,
Создаем исходные данные:
create table t (f number (5))
/
begin
for cnt in 1001..1020 loop
insert into t (f) values (cnt*2);
end loop;
end;
/
commit
/
Выборка
select f, (select count(f) cf from t where f <= a.f) num from t a; _________________ С наилучшими пожеланиями
Demiurge |
|
Вернуться к началу |
|
|
Прохожий Гость
|
Добавлено: Вт Июн 01 2004 13:16 Заголовок сообщения: Простой sql |
|
|
Пусть есть таблица tmp
и в ней primary key - n,
тогда
SELECT t.n ,
(SELECT COUNT(*) FROM tmp t2 WHERE t2.n <= t.n ) AS rownumber
FROM tmp t
ORDER BY t.n; |
|
Вернуться к началу |
|
|
Astaroth
Зарегистрирован: 17.05.2004 Сообщения: 453 Откуда: Питер
|
Добавлено: Вт Июн 01 2004 13:23 Заголовок сообщения: |
|
|
Угу... А если табличка уже есть, а не создается заново? И о табличке мы знаем только то, что на ней pk висит?
И о pk мы знаем только то, что он есть, а он и текстовым может быть... _________________ Не очеловечивайте компы - они этого не любят! |
|
Вернуться к началу |
|
|
Прохожий Гость
|
Добавлено: Вт Июн 01 2004 13:26 Заголовок сообщения: --- |
|
|
Для сравнения по <= все равно
что текст, что цифирь , однако ... |
|
Вернуться к началу |
|
|
Demiurge
Зарегистрирован: 05.04.2004 Сообщения: 33 Откуда: Казахстан, Астана
|
Добавлено: Вт Июн 01 2004 13:34 Заголовок сообщения: |
|
|
А в чем проблема , если это первичный ключ, то по определению на него уже создан индекс, по которому работает отношение порядка, а там пусть он будет хоть текстовым, это не имеет значения. и до остальных полей дела нет - в запросе они не используются
При желании проверь сам на какой-нибудь уже существующей таблице, разницы нет, будет работать _________________ С наилучшими пожеланиями
Demiurge |
|
Вернуться к началу |
|
|
wildwind
Зарегистрирован: 03.02.2004 Сообщения: 268 Откуда: Москва
|
Добавлено: Вт Июн 01 2004 14:13 Заголовок сообщения: |
|
|
Demiurge
Оно самое. |
|
Вернуться к началу |
|
|
Astaroth
Зарегистрирован: 17.05.2004 Сообщения: 453 Откуда: Питер
|
Добавлено: Вт Июн 01 2004 14:26 Заголовок сообщения: |
|
|
Осталось найти подходящую таблицу... Но проверю обязательно! _________________ Не очеловечивайте компы - они этого не любят! |
|
Вернуться к началу |
|
|
Demiurge
Зарегистрирован: 05.04.2004 Сообщения: 33 Откуда: Казахстан, Астана
|
Добавлено: Вт Июн 01 2004 17:34 Заголовок сообщения: |
|
|
Используй любую, у которой есть primary key _________________ С наилучшими пожеланиями
Demiurge |
|
Вернуться к началу |
|
|
cerber
Зарегистрирован: 19.12.2003 Сообщения: 296 Откуда: Казахстан, Актюбинск
|
Добавлено: Ср Июн 02 2004 07:49 Заголовок сообщения: |
|
|
Так UPDATE'том не проще будет? |
|
Вернуться к началу |
|
|
|