Supponiamo che abbia un tavolo con 10 dischi / tuple. Ora voglio aggiornare un attributo del sesto record con lo stesso attributo del 1 ° record, 2 ° -7 °, 3 ° -8 °, 4 ° -9 °, 5 ° -10 ° in un go, vale a dire senza utilizzare il cursore / loop. È consentito l'uso di qualsiasi numero di tabelle temporanee. Qual è la strategia per farlo?
risposte:
0 per risposta № 1PostgreSQL (e probabilmente altri RDBMS) ti permettono di usare auto-join in UPDATE
dichiarazioni come puoi SELECT
dichiarazioni:
UPDATE tbl
SET attr = t2.attr
FROM tbl t2
WHERE tbl.id = t2.id + 5
AND tbl.id >= 6
0 per risposta № 2
Questo sarebbe facile con un aggiornamento con join maOracle non lo fa e il sostituto più vicino può essere molto complicato per mettersi al lavoro, ecco il modo più semplice: coinvolge una subquery per ottenere il nuovo valore e una sottoquery correlata nel where
clausola. Sembra complicato ma il set
la sottoquery dovrebbe essere auto-esplicativa.
Il where
la subquery ha in realtà solo uno scopo: collega le due tabelle, molto come la on
farebbe una clausola se potessimo fare un join. Tranne che il campo utilizzato dalla tabella principale (quello in fase di aggiornamento) dovere essere un campo chiave. A quanto pare, con il self "join" che viene eseguito di seguito, entrambi sono lo stesso campo, ma è obbligatorio.
Aggiungi al where
clausola altri criteri restrittivi, come mostrato.
update Tuples t1
set t1.Attr =(
select t2.Attr
from Tuples t2
where t2.Attr = t1.Attr - 5 )
where exists(
select t2.KeyVal
from Tuples t2
where t1.KeyVal = t2.KeyVal)
and t1.Attr > 5;
SqlFiddle sta tirando un sibilo in questo momento, quindi qui i dati usati:
create table Tuples(
KeyVal int not null primary key,
Attr int
);
insert into Tuples
select 1, 1 from dual union all
select 2, 2 from dual union all
select 3, 3 from dual union all
select 4, 4 from dual union all
select 5, 5 from dual union all
select 6, 6 from dual union all
select 7, 7 from dual union all
select 8, 8 from dual union all
select 9, 9 from dual union all
select 10, 10 from dual;
Il tavolo inizia così:
KEYVAL ATTR
------ ----
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10
con questo risultato:
KEYVAL ATTR
------ ----
1 1
2 2
3 3
4 4
5 5
6 1
7 2
8 3
9 4
10 5