Нда? Задачка на перемешивание и чтоб одним предложением? Губа не дура.StS писал(а):Дык... эта... Я ж написал - SQL задачка. Думал что можно голым SQLем обойтись.Vovchik писал(а): Процедуру ваяй хранимую. С циклом. И делай в ней что хошь.
Эх, видно не судьба...
SQL задачка
Правила форума
Пожалуйста, ознакомьтесь с правилами данного форума
Пожалуйста, ознакомьтесь с правилами данного форума
-
- Маньяк
- Сообщения: 2841
- Зарегистрирован: 20 фев 2003, 09:15
- Откуда: Vancouver
-
- Пользователь
- Сообщения: 141
- Зарегистрирован: 21 мар 2005, 20:08
- Откуда: St. Petersburg->Vancouver
-
- Завсегдатай
- Сообщения: 301
- Зарегистрирован: 04 май 2005, 11:33
create table test2 (id int) with oids;hawk писал(а):Был бы в postgresql аналог rownum или analytic functions- задача решалась бы одним простым update.
А так действительно непросто.
insert into test2 (id) (select id from test);
oid in test2 [trn]soderzhit nomer zapisi. A vse ravno ne rabotaet.
Vrode prostaya zadachka, a bez procedur nikak.[/trn]
-
- Пользователь
- Сообщения: 141
- Зарегистрирован: 21 мар 2005, 20:08
- Откуда: St. Petersburg->Vancouver
StS писал(а): create table test2 (id int) with oids;
insert into test2 (id) (select id from test);
oid in test2 [trn]soderzhit nomer zapisi. A vse ravno ne rabotaet.
Vrode prostaya zadachka, a bez procedur nikak.[/trn]
Тот, да не тот OID - всего лишь 4-х байтовый полуюникальный генератор.
В общем не зря его в 8.1 перестали включать по умолчанию. А rownum - это порядок в fetch-е. Т.е. select rownum,id from (select id from test order by id desc) - покажет все-равно 1,2,3 для rownum.
В целом в postgresql - задачка решается созданием двух sequences и потом их дропом. Конечно не слишком паралельно, но работать будет
Код: Выделить всё
begin;
create table test(id int,newid int);
insert into test (select generate_series,null from generate_series(1,1000));
-- to make a hole in a sequence, but keep it unique
delete from test where id=50;
delete from test where id=500;
commit;
-- query
begin;
set transaction ISOLATION LEVEL SERIALIZABLE;
-- to make row count stable;
create sequence t1;
create sequence t2;
create temporary table test_t1 (rownum int,id int) on commit drop;
create temporary table test_t2 (rownum int,id int) on commit drop;
insert into test_t1 (select nextval('t1'),id from (select id from test order by random()) a);
insert into test_t2 (select nextval('t2'),id from (select id from test order by random()) a);
update test set newid = (select t1.id from test_t1 t1,test_t2 t2 where t2.id=test.id and t2.rownum=t1.rownum);
drop sequence t1;
drop sequence t2;
commit;
Код: Выделить всё
with
t1 as (select rownum myrownum, id from (select id from test order by random())),
t2 as (select rownum myrownum, id from (select id from test order by random()))
select t1.id,t2.id from t1,t2 where t1.myrownum=t2.myrownum;
второй random - конечно не обязателен, просто смотрится симметричнее

-
- Завсегдатай
- Сообщения: 301
- Зарегистрирован: 04 май 2005, 11:33
-
- Маньяк
- Сообщения: 2841
- Зарегистрирован: 20 фев 2003, 09:15
- Откуда: Vancouver
-
- Завсегдатай
- Сообщения: 301
- Зарегистрирован: 04 май 2005, 11:33