SQL задачка
Правила форума
Пожалуйста, ознакомьтесь с правилами данного форума
Пожалуйста, ознакомьтесь с правилами данного форума
-
- Завсегдатай
- Сообщения: 301
- Зарегистрирован: 04 май 2005, 11:33
SQL задачка
CREATE TABLE test (id int, newid int);
id содержит случайные уникальные числа (primary key). Требуется перемешать id случайным образом и поместить их в newid так, чтобы newid!=id.
Thanks
id содержит случайные уникальные числа (primary key). Требуется перемешать id случайным образом и поместить их в newid так, чтобы newid!=id.
Thanks
-
- Маньяк
- Сообщения: 2841
- Зарегистрирован: 20 фев 2003, 09:15
- Откуда: Vancouver
Re: SQL задачка
Условия противоречивы. Ежели чтоб newid!=id - то это уже не случайным образом. А во вторых - нету такой вещи - SQL. Хотя 80% компьютерщиков считает что есть. Есть ANSI-92 SQL Entry Level, есть PL/SQL есть Transact-SQL, есть E-SQL... Так что вопрос по существу - а база то какая?StS писал(а):CREATE TABLE test (id int, newid int);
id содержит случайные уникальные числа (primary key). Требуется перемешать id случайным образом и поместить их в newid так, чтобы newid!=id.
Thanks
-
- Завсегдатай
- Сообщения: 301
- Зарегистрирован: 04 май 2005, 11:33
-
- Маньяк
- Сообщения: 2841
- Зарегистрирован: 20 фев 2003, 09:15
- Откуда: Vancouver
Есть маза что тебе придется мануал изучать. Есть ли в постгресе че нить типа rand(a)? Ежели даже есть - она как пить дать фуфло. Так что далее надо подумать пойдет ли оно тебе. А далее - хранимая процедура с промежуточной таблицей и курсором.StS писал(а):[trn]Nu horosho, horosho. Snimaem ogranichenie [/trn] newid!=id.
DB - PostgreSQL.
-
- Завсегдатай
- Сообщения: 301
- Зарегистрирован: 04 май 2005, 11:33
[trn]Est' [/trn]random()[trn] kotoryj daet chislo ot 0 do 1. Mozhno sdelat'[/trn] setseed(random());round(a*random())
[trn]Fuflo, ne fuflo - nevazhno. Mne ne chisla v kazino generit'. Dal'she chto?
Sdelat' kopiju tablicy, generit' kursor, muvit' na sluchajnoe cihslo, vstavlyat' v original, udalyat' iz kopii, peregenerit' kursor. Tak chto li?[/trn]
[trn]Fuflo, ne fuflo - nevazhno. Mne ne chisla v kazino generit'. Dal'she chto?
Sdelat' kopiju tablicy, generit' kursor, muvit' na sluchajnoe cihslo, vstavlyat' v original, udalyat' iz kopii, peregenerit' kursor. Tak chto li?[/trn]
- aissp
- Маньяк
- Сообщения: 2710
- Зарегистрирован: 07 ноя 2005, 09:51
Ну типа так
UPDATE bla-bla SET NEW_ID = (SELECT id FROM bla_bla ORDER BY RANDOM() LIMIT 1)
ну а если надо еще уникальнасть добавить то придется еще запросер всобачить NOT IN который. Другой вопрос что не очень ето еффективно, но в условиях про еффективность не было ни слова.
ну а если надо еще уникальнасть добавить то придется еще запросер всобачить NOT IN который. Другой вопрос что не очень ето еффективно, но в условиях про еффективность не было ни слова.
-
- Маньяк
- Сообщения: 2841
- Зарегистрирован: 20 фев 2003, 09:15
- Откуда: Vancouver
Можно так. Можно просто забабахать цикл и делать запись по одному. А можно вот как чувак советует ежели постгрес такую конструкцию сожрет.StS писал(а):[trn]Est' [/trn]random()[trn] kotoryj daet chislo ot 0 do 1. Mozhno sdelat'[/trn] setseed(random());round(a*random())
[trn]Fuflo, ne fuflo - nevazhno. Mne ne chisla v kazino generit'. Dal'she chto?
Sdelat' kopiju tablicy, generit' kursor, muvit' na sluchajnoe cihslo, vstavlyat' v original, udalyat' iz kopii, peregenerit' kursor. Tak chto li?[/trn]
-
- Завсегдатай
- Сообщения: 301
- Зарегистрирован: 04 май 2005, 11:33
-
- Маньяк
- Сообщения: 2841
- Зарегистрирован: 20 фев 2003, 09:15
- Откуда: Vancouver
Да я даже знаю почему. Сдается мне придется тебе процедуру ваять. Слепишь цикл, в нем генери случайное число и пиши в базу - одно значение за ход. Попутно мона влепить проверку на уникальность и все чего угодно.StS писал(а):[trn]Sozhrat'-to on sozhral, no vse[/trn] newid [trn]poluchilis' odinakovye.[/trn]
- aissp
- Маньяк
- Сообщения: 2710
- Зарегистрирован: 07 ноя 2005, 09:51
Хм
Извини ьрат постгреса под рукой нет проверить попробуй к LIMIT добавить OFFSET 0 --- LIMIT 1 OFFSET 0 ну или со временной таблицей, вместо внутреннего селекта что нибудь типа
SELECT id
FROM (SELECT id, RANDOM()
FROM bla_bla ORDER BY 2) temp_table_name
LIMIT 1;
SELECT id
FROM (SELECT id, RANDOM()
FROM bla_bla ORDER BY 2) temp_table_name
LIMIT 1;
-
- Завсегдатай
- Сообщения: 301
- Зарегистрирован: 04 май 2005, 11:33
-
- Маньяк
- Сообщения: 2841
- Зарегистрирован: 20 фев 2003, 09:15
- Откуда: Vancouver
Естессно - у тебя ж where clause отсутствует. Он и апдейтит всю таблицу.StS писал(а):SELECT id FROM test LIMIT 1 OFFSET round(46823*random());
[trn]Vozvraschaet sluchajnyj id, no[/trn]
UPDATE test2 SET ID = (SELECT id FROM test LIMIT 1 OFFSET round(46823*random()))
[trn]daet vse id v test2 odinakovymi
46823 - chislo strok v tablice[/trn]
-
- Завсегдатай
- Сообщения: 301
- Зарегистрирован: 04 май 2005, 11:33
-
- Маньяк
- Сообщения: 2841
- Зарегистрирован: 20 фев 2003, 09:15
- Откуда: Vancouver
-
- Завсегдатай
- Сообщения: 301
- Зарегистрирован: 04 май 2005, 11:33