SQL задачка

Все, что вы хотели знать о программизме, но боялись спросить.
StS
Завсегдатай
Сообщения: 301
Зарегистрирован: 04 май 2005, 11:33

SQL задачка

Сообщение StS »

CREATE TABLE test (id int, newid int);
id содержит случайные уникальные числа (primary key). Требуется перемешать id случайным образом и поместить их в newid так, чтобы newid!=id.

Thanks
Vovchik
Маньяк
Сообщения: 2841
Зарегистрирован: 20 фев 2003, 09:15
Откуда: Vancouver

Re: SQL задачка

Сообщение Vovchik »

StS писал(а):CREATE TABLE test (id int, newid int);
id содержит случайные уникальные числа (primary key). Требуется перемешать id случайным образом и поместить их в newid так, чтобы newid!=id.

Thanks
Условия противоречивы. Ежели чтоб newid!=id - то это уже не случайным образом. А во вторых - нету такой вещи - SQL. Хотя 80% компьютерщиков считает что есть. Есть ANSI-92 SQL Entry Level, есть PL/SQL есть Transact-SQL, есть E-SQL... Так что вопрос по существу - а база то какая?
StS
Завсегдатай
Сообщения: 301
Зарегистрирован: 04 май 2005, 11:33

Сообщение StS »

[trn]Nu horosho, horosho. Snimaem ogranichenie [/trn] newid!=id.

DB - PostgreSQL.
Vovchik
Маньяк
Сообщения: 2841
Зарегистрирован: 20 фев 2003, 09:15
Откуда: Vancouver

Сообщение Vovchik »

StS писал(а):[trn]Nu horosho, horosho. Snimaem ogranichenie [/trn] newid!=id.

DB - PostgreSQL.
Есть маза что тебе придется мануал изучать. Есть ли в постгресе че нить типа rand(a)? Ежели даже есть - она как пить дать фуфло. Так что далее надо подумать пойдет ли оно тебе. А далее - хранимая процедура с промежуточной таблицей и курсором.
StS
Завсегдатай
Сообщения: 301
Зарегистрирован: 04 май 2005, 11:33

Сообщение 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]
Аватара пользователя
aissp
Маньяк
Сообщения: 2710
Зарегистрирован: 07 ноя 2005, 09:51

Ну типа так

Сообщение aissp »

UPDATE bla-bla SET NEW_ID = (SELECT id FROM bla_bla ORDER BY RANDOM() LIMIT 1)

ну а если надо еще уникальнасть добавить то придется еще запросер всобачить NOT IN который. Другой вопрос что не очень ето еффективно, но в условиях про еффективность не было ни слова.
Vovchik
Маньяк
Сообщения: 2841
Зарегистрирован: 20 фев 2003, 09:15
Откуда: Vancouver

Сообщение Vovchik »

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]
Можно так. Можно просто забабахать цикл и делать запись по одному. А можно вот как чувак советует ежели постгрес такую конструкцию сожрет.
StS
Завсегдатай
Сообщения: 301
Зарегистрирован: 04 май 2005, 11:33

Сообщение StS »

[trn]Sozhrat'-to on sozhral, no vse[/trn] newid [trn]poluchilis' odinakovye.[/trn] :(
Vovchik
Маньяк
Сообщения: 2841
Зарегистрирован: 20 фев 2003, 09:15
Откуда: Vancouver

Сообщение Vovchik »

StS писал(а):[trn]Sozhrat'-to on sozhral, no vse[/trn] newid [trn]poluchilis' odinakovye.[/trn] :(
Да я даже знаю почему. Сдается мне придется тебе процедуру ваять. Слепишь цикл, в нем генери случайное число и пиши в базу - одно значение за ход. Попутно мона влепить проверку на уникальность и все чего угодно.
Аватара пользователя
aissp
Маньяк
Сообщения: 2710
Зарегистрирован: 07 ноя 2005, 09:51

Хм

Сообщение aissp »

Извини ьрат постгреса под рукой нет проверить попробуй к LIMIT добавить OFFSET 0 --- LIMIT 1 OFFSET 0 ну или со временной таблицей, вместо внутреннего селекта что нибудь типа

SELECT id
FROM (SELECT id, RANDOM()
FROM bla_bla ORDER BY 2) temp_table_name
LIMIT 1;
StS
Завсегдатай
Сообщения: 301
Зарегистрирован: 04 май 2005, 11:33

Сообщение 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]
Vovchik
Маньяк
Сообщения: 2841
Зарегистрирован: 20 фев 2003, 09:15
Откуда: Vancouver

Сообщение Vovchik »

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]
Естессно - у тебя ж where clause отсутствует. Он и апдейтит всю таблицу.
StS
Завсегдатай
Сообщения: 301
Зарегистрирован: 04 май 2005, 11:33

Сообщение StS »

update test2 set id=null;
UPDATE test2 SET ID = (SELECT id FROM test LIMIT 1 OFFSET round(46823*random())) WHERE id is null;
[trn]ta zhe fignya.[/trn]
Vovchik
Маньяк
Сообщения: 2841
Зарегистрирован: 20 фев 2003, 09:15
Откуда: Vancouver

Сообщение Vovchik »

StS писал(а):update test2 set id=null;
UPDATE test2 SET ID = (SELECT id FROM test LIMIT 1 OFFSET round(46823*random())) WHERE id is null;
[trn]ta zhe fignya.[/trn]
Процедуру ваяй хранимую. С циклом. И делай в ней что хошь.
StS
Завсегдатай
Сообщения: 301
Зарегистрирован: 04 май 2005, 11:33

Сообщение StS »

Vovchik писал(а): Процедуру ваяй хранимую. С циклом. И делай в ней что хошь.
Дык... эта... Я ж написал - SQL задачка. Думал что можно голым SQLем обойтись.
Эх, видно не судьба...
Ответить