2013-02-17 11 views
6

Come posso mostrare il numero di righe in una tabella in modo che quando viene aggiunto un nuovo record il numero che rappresenta la riga aumenti e quando un record viene cancellato il numero viene aggiornato di conseguenza?
Per essere più chiari, supponiamo di avere una semplice tabella come questa:Come posso assegnare un numero a ciascuna riga in una tabella che rappresenta il numero del record?

ID int (chiave primaria) Nome varchar (5)

L'ID è impostato per essere incrementato da solo (usando specifica identità) in modo che non può rappresentare il numero di riga (record) in quanto se devo per esempio 3 record come:

NOME ID
1 Alex
2 Scott
3 Sara

e io cancellare Alex e Scott e aggiungere un nuovo record sarà:

3 Sara 
4 Mina 

Quindi, fondamentalmente sto cercando una soluzione sql-side per fare questo in modo che Non cambio nient'altro nel codice sorgente in più posti.

Ho provato a scrivere qualcosa per portare a termine il lavoro ma non funziona. Eccolo:

SELECT  COUNT(*) AS [row number],Name 
FROM   dbo.Test 
GROUP BY ID, Name 
HAVING  (ID = ID) 

Questo dimostra come:

row number   Name 
1      Alex 
1      Scott 
1      Sara 

mentre io voglio che per ottenere mostrato come:

row number   Name 
1      Alex 
2      Scott 
3      Sara 
+0

Cosa hai provato e dove vuoi mostrare no di righe? – DevelopmentIsMyPassion

+0

Ho aggiornato la domanda. Voglio mostrare i numeri quando uso i comandi select.in modo che ogni volta che seleziono i risultati abbiano una normale numerazione che rappresenta i record. – Breeze

+0

Non riesci a mostrare l'ID generato nella colonna del numero di riga? Non ha capito che cosa è l'uso del conteggio (*) – DevelopmentIsMyPassion

risposta

8

Se si desidera solo il numero contro le righe durante la selezione dei dati e non nel database, allora è possibile utilizzare questo

select row_number() over(order by id) from dbo.Test 

Questo vi darà il numero di riga n per ennesima riga.

+0

perché ottengo "Il costrutto o istruzione OVER SQL non è supportato." errore? (capito, non dovrei farlo nel designer :)) – Breeze

+0

sì, hai capito bene! – Saksham

2

quello che vuoi è chiamato incremento automatico.

Per SQL-Server questo si ottiene aggiungendo l'attributo IDENTITY(1,1) alla definizione della tabella.

Altri RDBMS utilizzano una sintassi diversa. Firebird ad esempio ha generatori, che eseguono il conteggio. In un trigger BEFORE-INSERT si assegnerebbe il campo ID al valore corrente del generatore (che verrà aumentato automaticamente).

+0

Lo so e lo sto usando ora, il problema con Identity (1,1) è che se ho record aleardy ed elimini quelli (supponiamo numero ID 1) e ricomincio lo farò non ottenere di nuovo il numero 1 come ID anche se non ci sono record! se ho 3 record come (1 2 3, e cancelli il numero due, saranno come (1 3) voglio portarli a 'show' come (1 2) – Breeze

+0

Perché lo vuoi? Ok, supponi di volerlo , quindi utilizzare un trigger e una seconda tabella che contiene gli ID eliminati. – alzaimar

+0

In che modo potrei farlo? a parte questo è ancora più ragionevole usare row_number() in questo scenario? – Breeze

0

Ho avuto questo problema esatto qualche tempo fa, ma stavo usando SQL Server 2000, quindi anche se il numero di riga() è la soluzione migliore, in SQL Server 2000, questo non è disponibile . Una soluzione alternativa per questo è creare una tabella temporanea, inserire tutti i valori con incremento automatico e sostituire la tabella corrente con la nuova tabella in T-SQL.

Problemi correlati