2013-03-04 12 views
19

Desidero definire l'inizio di ROW_NUMBER() come 3258170 anziché 1.Specificare manualmente il valore iniziale per Row_Number()

Sto usando la seguente query SQL

SELECT ROW_NUMBER() over(order by (select 3258170)) as 'idd'. 

Tuttavia, la query di cui sopra non funziona. Quando dico che non funziona, intendo che è in esecuzione, ma non a partire da 3258170. Qualcuno può aiutarmi?

Il motivo per cui desidero specificare il numero di riga è Sto inserendo Righe da una tabella a un'altra. Nella prima tabella il numero di riga dell'ultimo record è 3258169 e quando inserisco nuovi record voglio che abbiano il numero di riga da 3258170.

+0

0_0 Non sono sicuro che una cosa del genere sia possibile, ma io ** sono ** sicuro che sia un'idea orribile. Cosa stai cercando di realizzare? SQL Server ha colonne integer a incremento automatico, no? –

+1

non è possibile aggiungere una chiave primaria a incremento automatico per mantenere l'ID corretto? –

+0

Sì, posso farlo. Sto solo cercando di vedere se c'è un altro modo. – Huzaifa

risposta

36

Basta aggiungere il valore al risultato di row_number():

select 3258170 - 1 + row_number() over (order by (select NULL)) as idd 

La clausola order by di row_number() è specificare quale colonna viene utilizzata per l'ordine. Specificando una costante lì, stai semplicemente dicendo "tutto ha lo stesso valore per gli scopi di ordinazione". Non ha nulla, niente a che fare con il primo valore scelto.

Per evitare confusione, ho sostituito il valore costante con NULL. In SQL Server, ho rilevato che questo assegna un numero sequenziale senza effettivamente ordinare le righe: un vantaggio prestazionale osservato, ma non uno che ho visto documentato, quindi non possiamo dipendere da esso.

+0

Cosa c'è di sbagliato se si specifica il valore in select? – Huzaifa

+0

@John: è necessario capire cos'è ROW_NUMBER() e non è possibile assegnare valori ad esso. Puoi solo aggiungerlo. Dalla documentazione di Oracle: "ROW_NUMBER è una funzione analitica che assegna un numero univoco a ciascuna riga a cui è applicato (ciascuna riga nella partizione o ogni riga restituita dalla query), nella sequenza ordinata di righe specificate in order_by_clause , a partire da 1. " – Art

+0

Per MySQL vedere la risposta di OMG Ponies all'indirizzo: http://stackoverflow.com/questions/1895110/row-number-in-mysql –

3

sento che questo è più facile

ROW_NUMBER() OVER(ORDER BY Field) - 1 AS FieldAlias (To start from 0) 
ROW_NUMBER() OVER(ORDER BY Field) + 3258169 AS FieldAlias (To start from 3258170) 
0

volte ....

Il ROW_NUMBER() potrebbe non essere la soluzione migliore, soprattutto quando ci potrebbero essere record duplicati nel set di dati di base (per JOIN domande ecc.). Ciò potrebbe causare più righe restituite del previsto. Puoi prendere in considerazione la creazione di un SEQUENCE che in alcuni casi può essere considerato una soluzione più pulita. cioè .:

CREATE SEQUENCE myRowNumberId 
    START WITH 1 
    INCREMENT BY 1 
GO 

SELECT NEXT VALUE FOR myRowNumberId AS 'idd' -- your query 
GO 

DROP SEQUENCE myRowNumberId; -- just to clean-up after ourselves 
GO 

Lo svantaggio è che le sequenze possono essere difficili da utilizzare in query complesse con DISTINCT, funzioni finestra ecc Vedere la documentazione completa sequenza here.