2010-11-04 5 views
5

Nella tabella voglio poter "spostare" le righe, ho una colonna chiamata sortid, che automaticamente in insert è un valore più alto del più alto valore (facilmente reperibile selezionando il valore più alto quando si ordina il mio sortid desc).Spostamento delle righe "su e giù" in un database (guida in linea SQL)

Ma io sono un po 'confuso su quale query vorrei utilizzare per le azioni' su/giù 'per ogni riga sulla mia pagina ASP.NET. Quale query utilizzerei per selezionare immediatamente le righe "sotto" o "sopra" della riga da spostare?

Grazie

risposta

7

Lo spostamento verso l'alto o verso il basso di una registrazione avviene scambiandolo con il record prima o dopo, rispettivamente.

Se i valori SortId sono sempre continui (ovvero non si rimuovono record che causerebbero un gap), è possibile aggiungere o sottrarre solo uno per ottenere il record successivo o precedente. Se i record non sono garantiti come continui, devi trovare il record accanto a quello che vuoi spostare.

Per trovare la SortId del record prima:

select max(SortId) from TheTable where SortId < @SortId 

Per trovare la SortId del record dopo:

select min(SortId) from TheTable where SortId > @SortId 

per scambiare i due record, è possibile utilizzare questo trucco che si calcola valore dall'altra:

update TheTable 
set SortId = @SortId1 + @SortId2 - SortId 
where SortId in (@SortId1, @SortId2) 
+0

Mi piace la tua soluzione – kta

3

Una possibilità è quella di incrementare tutti i sortid campi delle righe "sotto" appena prima INSERT ing nuova riga. È possibile farlo con un comando UPDATE seguito immediatamente da un comando INSERT. Diciamo che si sta inserendo una riga alla posizione 10. Poi si può fare qualcosa di simile:

UPDATE your_table SET sortid = sortid + 1 WHERE sortid >= 10; 
INSERT INTO your_table (..., sortid) VALUES (..., 10); 

Probabilmente si dovrebbe concludere che in un transaction per assicurare che l'operazione viene eseguita atomically.

Per quanto riguarda le azioni su/giù, non si desidera eseguire un INSERT. Quanto sopra è appropriato solo per aggiungere nuove righe in una particolare "posizione". Per l'azione su/giù, puoi semplicemente "scambiare" il valore sortid delle due righe, come @Guffa suggested in the other answer.

1

Per ottenere le righe sopra la riga di destinazione.

select * from [TableName] 
where sortid > (select sortid from [TableName] 
       where id = @id) 

Per quelli di seguito, utilizzare solo < invece.

Problemi correlati