dannyboy
wzl-lid
Sinds 31/5/2005
T: 108
R: 883
|
15/12/2009 -
14:29u
| Quote
|
Hoi,
Ik zoek een query die mij de ontbrekende waarden van een geïncrimenteerde kolom weergeeft.
stel dus dat je volgende kolom hebt:
ID --- 1 2 3 5 6 9 10 11 12 13
Dan moet de query het volgende teruggeven:
ID --- 4 7 8
Ik heb al een oplossing door een vaste tabel met waardes van 1 tot 10000000 te maken en te checken welke van deze niet voorkomen in de ID kolom, maar dat vind ik nogal omslachtig en niet echt proper...
|
mrvazil
wzl-lid
Sinds 15/5/2005
T:6 -
R:780
|
16/12/2009 -
14:03u
| Quote
|
ge zou ook kunnen kijken of de opgehaalde ID gelijk is aan de vorige +1, en anders de vorige+1 naar de output schrijven maar ik denk dat dat vrij veel overhead gaat geven
|
dannyboy
wzl-lid
Sinds 31/5/2005
T:108 -
R:883
|
16/12/2009 -
16:10u
| Quote
|
mrvazil schreef: ge zou ook kunnen kijken of de opgehaalde ID gelijk is aan de vorige +1, en anders de vorige+1 naar de output schrijven maar ik denk dat dat vrij veel overhead gaat geven Ook enig idee hoe ik aan de vorige waarde kom zonder effectief een loop te maken? Kwerk hier met SQLserver 2000...
|
mrvazil
wzl-lid
Sinds 15/5/2005
T:6 -
R:780
|
16/12/2009 -
20:12u
| Quote
|
nope, geen flauw idee
maar ik vraag het dinsdag eens aan m'n docent, mss weet hij een oplossing
Laatst aangepast door
mrvazil
op 16/12/2009 20:13:11u
(1x aangepast)
|
mrvazil
wzl-lid
Sinds 15/5/2005
T:6 -
R:780
|
22/12/2009 -
14:14u
| Quote
|
als er maximum een waarde tussen ontbreekt kunt ge het met ne left-join doen, joinen op veld = veld+1 indien er meer als een waarde ontbreekt kunt ge het niet met sql doen maar moet ge transact gebruiken en loopen.
of ge creëert een tijdelijke tabel met alle nummers van 1 tot hoogste nummer uit uw huidige en doet ne select van de waarden die nie in uw huidige voorkomen...
|
dannyboy
wzl-lid
Sinds 31/5/2005
T:108 -
R:883
|
22/12/2009 -
20:24u
| Quote
|
mrvazil schreef: als er maximum een waarde tussen ontbreekt kunt ge het met ne left-join doen, joinen op veld = veld+1 indien er meer als een waarde ontbreekt kunt ge het niet met sql doen maar moet ge transact gebruiken en loopen.
of ge creëert een tijdelijke tabel met alle nummers van 1 tot hoogste nummer uit uw huidige en doet ne select van de waarden die nie in uw huidige voorkomen... Die oplossingen had ik allemaal geprobeerd Maar tis al nie meer nodig. Kga het wel laten opstaan omdat ik het toch een interessant probleem vind. Misschien dat iemand nog suggesties heeft...
|
obaldius
wzl-lid
Sinds 28/8/2006
T:8 -
R:41
|
7/1/2010 -
12:09u
| Quote
|
tof,
Maar zijt ge op zoek naar een commando die da doet? Of naar een systeem? Want ik ken niet genoeg van SQL om die commandos te kennen, maar ik kan wel een efficiënte loop bedenken die gewoon werkt met alle IDs die in één lijst geschreven zijn ...
x is getal dat de lijst afloopt, begint bij 0 a is getal waarmee we chekken, begint bij 1 list1 de lijst met alle IDs list2 de lijst met de onbrekende
while (a < list1(list1.length)) ----- Dus zolang x nie groter is dan u grootste waarde in u lijst { if (list1(x) =! a) { <dan steken we a in list2> }else { x=x+1 } a= a+1 }
|
dannyboy
wzl-lid
Sinds 31/5/2005
T:108 -
R:883
|
19/1/2010 -
12:45u
| Quote
|
obaldius schreef: tof,
Maar zijt ge op zoek naar een commando die da doet? Of naar een systeem? Want ik ken niet genoeg van SQL om die commandos te kennen, maar ik kan wel een efficiënte loop bedenken die gewoon werkt met alle IDs die in één lijst geschreven zijn ...
x is getal dat de lijst afloopt, begint bij 0 a is getal waarmee we chekken, begint bij 1 list1 de lijst met alle IDs list2 de lijst met de onbrekende
while (a < list1(list1.length)) ----- Dus zolang x nie groter is dan u grootste waarde in u lijst { if (list1(x) =! a) { <dan steken we a in list2> }else { x=x+1 } a= a+1 } Als het zo simpel was, kwam ik het niet vragen. Die lijst met cijfers waar er een aantal ontbreken zitten in een database en het is net de bedoeling om de ontbrekende op te halen in een simpele SQL query, zonder loops dus. Anders kan ik wel 101 manieren bedenken om het te doen. Ik weet niet precies wat uw definities zijn van 'commando' en 'systeem', maar als ge met 'commando' een 'query' bedoelt, dan is het inderdaad daarin dat ik het zoek. Standaard SQL is niet proceduraal, zoals de code in uw voorbeeld...
Toch bedankt om er eens over na te denken
Laatst aangepast door
dannyboy
op 19/01/2010 12:46:02u
(1x aangepast)
|
obaldius
wzl-lid
Sinds 28/8/2006
T:8 -
R:41
|
19/1/2010 -
22:11u
| Quote
|
wel, ik denk niet dat er een query bestaat om dingen op te halen die niet bestaan ... andersom zou je bvb wel alle IDs die verwijder worden niet verwijderen maar in de 2e kolom op NULL zetten. En met de query haal je alle waarden binnen wie voor de 2e kolom op NULL staan...
Dit is dan wel ten koste van uw database... hangt ervan af wat je eigenlijk van plan bent.
Wat heb je eigenlijk gemaakt, of is het te moeilijk nu even snel uit te leggen?
|
dannyboy
wzl-lid
Sinds 31/5/2005
T:108 -
R:883
|
20/1/2010 -
6:40u
| Quote
|
obaldius schreef: wel, ik denk niet dat er een query bestaat om dingen op te halen die niet bestaan ... andersom zou je bvb wel alle IDs die verwijder worden niet verwijderen maar in de 2e kolom op NULL zetten. En met de query haal je alle waarden binnen wie voor de 2e kolom op NULL staan...
Dit is dan wel ten koste van uw database... hangt ervan af wat je eigenlijk van plan bent.
Wat heb je eigenlijk gemaakt, of is het te moeilijk nu even snel uit te leggen? Goh, ik weet het al nie meer precies. Maar ik dacht dat het over de rijnummers gaan van een excel file. Ik had een module om excel files rij per rij te valideren en naar de database te schrijven met extra informatie zoals de nummer van de rij in de excel file, en ik wilde dus de nummers van de rijen weergeven die niet geupload waren door parsing errors of whatever.
En queries kunnen dingen berekenen. 1 van de eerste probeersels in verband met dit probleem was ne JOIN met zichzelf waarbij we de ID kolom vergelijken met dezelfde kolom, maar dan +1 bij elke waarde. bv:
tbl ID --- 1 2 3 5 6 8 9 10 11 12 13
SELECT t1.ID, t2.ID AS 'ID+1' FROM tbl t1 LEFT OUTER JOIN tbl t2 ON t1.ID+1 = t2.ID
ID ID+1 --- ------- 1 2 2 3 3 NULL 5 6 6 NULL 8 9 9 10 10 11 11 12 12 13 13 NULL
En als we bovenstaande query een beetje veranderen bekomen we het volgende:
SELECT t1.ID + 1 FROM tbl t1 LEFT OUTER JOIN tbl t2 ON t1.ID+1 = t2.ID WHERE t2.ID IS NULL
ID --- 3 6 13
Maar zoals je ziet geeft dit al problemen met de 13 dat eigenlijk gewoon de laatste rij kan zijn en dit zou ook niet werken als er meer dan 1 opeenvolgende rijnummer er niet zou inzitten
Laatst aangepast door
dannyboy
op 20/01/2010 6:41:06u
(1x aangepast)
|