Query insert e numeri

giovedì 04 gennaio 2007 - 14.37

crosino75 Profilo | Newbie

ciao a tutti,

mi trovo in questa situazione:
ho un database già esistente e non modificabile nel quale esiste una colonna "codice" con valori indicizzati e duplicati non ammessi; es:

1000
1001
1002
1003

1005

etc..etc..

ecco,
io vorrei creare un processo che mi consenta di scovare il buco mancante nella sequenza (nell esempio 1004) e di riempire il buco con un nuovo articolo.

avevo pensato ad un qualcosa del tipo se la query con ID 1000 non riesce, passa al valore 1001... 1002...1003... 1004 = ecco riuscita!

Ma non so se sia la strada corretta, come posso fare?

Grazie

Emanuele

alx_81 Profilo | Guru

>ciao a tutti,
>
>mi trovo in questa situazione:
>ho un database già esistente e non modificabile nel quale esiste
>una colonna "codice" con valori indicizzati e duplicati non ammessi;
>es:
>
>1000
>1001
>1002
>1003
>
>1005
>
>etc..etc..
>
>ecco,
>io vorrei creare un processo che mi consenta di scovare il buco
>mancante nella sequenza (nell esempio 1004) e di riempire il
>buco con un nuovo articolo.
>

Immagino che il db di cui stai parlando sia Access, giusto?
poi, quella colonna, che è di una particolare tabella, è autoincrementante? è un contatore insomma?
Se rispondi a queste domande possiamo procedere oltre..
>Grazie
>
>Emanuele
Ciao!
>
>

Alx81 =)

http://blogs.dotnethell.it/suxstellino

crosino75 Profilo | Newbie

no, putroppo non è un contatore auto incrementante e non posso modificare le attuali opzioni di colonna; il DB è access

grazie

ema

alx_81 Profilo | Guru

>no, putroppo non è un contatore auto incrementante e non posso
>modificare le attuali opzioni di colonna; il DB è access

Se potessi aggiungere una colonna alla tabella incriminata che prende il valore del campo codice + 1, poi ti basterebbe una self join fatta in questo modo..
Supponiamo di avere una tabella denominata Table1 con all'interno i seguenti campi:

id numerico
idsucc numerico con default a id + 1

con la seguente query ricavi il primo libero:

SELECT TOP 1 Table1.idsucc
FROM Table1 T1
LEFT OUTER JOIN Table1 AS T2
ON T1.idsucc = T2.id
WHERE T2.id IS NULL
ORDER BY Table1.idsucc;

In poche parole metto la tabella in left join con se stessa (prendo quindi tutti i valori di quella a sinistra, inclusi quelli che non trovo nella tabella di destra) per idsucc della prima (quello che mi aspetto ci sia) e id della seconda (quello che c'è)..
Ricavando il primo record con la parte destra a NULL ottengo il primo valore disponibile..
Se non puoi aggiungere una colonna, controlla se puoi fare un campo calcolato al volo nella query..
Spero possa esserti comunque di aiuto..

ciao!

>
>grazie
>
>ema

Alx81 =)

http://blogs.dotnethell.it/suxstellino

paroca Profilo | Newbie

prova così:

SELECT TOP 1 SUCCESSIVO FROM (SELECT (ID + 1) AS SUCCESSIVO FROM TABELLA)
WHERE SUCCESSIVO NOT IN (SELECT ID FROM TABELLA)

Miao
Paroca

alx_81 Profilo | Guru

>prova così:
>
>SELECT TOP 1 SUCCESSIVO FROM (SELECT (ID + 1) AS SUCCESSIVO FROM
>TABELLA)
>WHERE SUCCESSIVO NOT IN (SELECT ID FROM TABELLA)

Attenzione, questa not in con all'interno la select dell'id di TABELLA, esegue un tablescan..
è preferibile una join, che è molto più performante.. magari non te ne accorgi con pochi dati.. ma con grandi quantità di informazioni, la differenza si sente..
cmq, ottimizzando la mia consiglio questa soluzione:

SELECT TOP 1 a.id + 1 AS Id_Voluto
FROM TABELLA a
LEFT JOIN TABELLA b
ON a.id + 1 = b.id
WHERE b.id + 1 IS NULL
>
>Miao
Miao!
>Paroca

Alx81 =)

http://blogs.dotnethell.it/suxstellino

paroca Profilo | Newbie

MOLTO VERO..

gli IN rallentano molto..
Meglio quella ottimizzata.

Miao
Paroca

crosino75 Profilo | Newbie

Grazie di cuore ragazzi... HO RISOLTO!

siete fantastici!

Emanuele
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5