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

SQL задачка

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

Thanks

Re: SQL задачка

Добавлено: 20 мар 2006, 09:31
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... Так что вопрос по существу - а база то какая?

Добавлено: 20 мар 2006, 10:19
StS
[trn]Nu horosho, horosho. Snimaem ogranichenie [/trn] newid!=id.

DB - PostgreSQL.

Добавлено: 21 мар 2006, 10:34
Vovchik
StS писал(а):[trn]Nu horosho, horosho. Snimaem ogranichenie [/trn] newid!=id.

DB - PostgreSQL.
Есть маза что тебе придется мануал изучать. Есть ли в постгресе че нить типа rand(a)? Ежели даже есть - она как пить дать фуфло. Так что далее надо подумать пойдет ли оно тебе. А далее - хранимая процедура с промежуточной таблицей и курсором.

Добавлено: 21 мар 2006, 11:29
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]

Ну типа так

Добавлено: 21 мар 2006, 11:57
aissp
UPDATE bla-bla SET NEW_ID = (SELECT id FROM bla_bla ORDER BY RANDOM() LIMIT 1)

ну а если надо еще уникальнасть добавить то придется еще запросер всобачить NOT IN который. Другой вопрос что не очень ето еффективно, но в условиях про еффективность не было ни слова.

Добавлено: 21 мар 2006, 12:07
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]
Можно так. Можно просто забабахать цикл и делать запись по одному. А можно вот как чувак советует ежели постгрес такую конструкцию сожрет.

Добавлено: 21 мар 2006, 12:10
StS
[trn]Sozhrat'-to on sozhral, no vse[/trn] newid [trn]poluchilis' odinakovye.[/trn] :(

Добавлено: 21 мар 2006, 12:14
Vovchik
StS писал(а):[trn]Sozhrat'-to on sozhral, no vse[/trn] newid [trn]poluchilis' odinakovye.[/trn] :(
Да я даже знаю почему. Сдается мне придется тебе процедуру ваять. Слепишь цикл, в нем генери случайное число и пиши в базу - одно значение за ход. Попутно мона влепить проверку на уникальность и все чего угодно.

Хм

Добавлено: 21 мар 2006, 12:44
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;

Добавлено: 21 мар 2006, 12:58
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]

Добавлено: 21 мар 2006, 13:00
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 отсутствует. Он и апдейтит всю таблицу.

Добавлено: 21 мар 2006, 13:03
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]

Добавлено: 21 мар 2006, 13:05
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]
Процедуру ваяй хранимую. С циклом. И делай в ней что хошь.

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