/ / Posso aggiornare un particolare attributo di una tupla con lo stesso attributo di un'altra tupla della stessa tabella? Se possibile, quale dovrebbe essere l'algoritmo? - algoritmo, plsql, sql-scripts

Posso aggiornare un particolare attributo di una tupla con lo stesso attributo di un'altra tupla della stessa tabella? Se possibile, quale dovrebbe essere l'algoritmo? - algoritmo, plsql, sql-scripts

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 № 1

PostgreSQL (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