NAVIGATIE

Freetime overzicht
Zoeken


  RUBRIEKEN

FAQ / Help
Wat mag niet?
WZL Wedstrijden
WZL Chat
WZL Toolbar
WZL Statistieken
WZL leden
WZL shop
E-cards

RSS

Fun-feed
Babe-feed
Stud-feed

Een groot aantal pokerrooms geven de mogelijkheid om poker te spelen op internet en geld te storten via het veilige iDeal betaalsysteem.
Overzicht » Computer » Programmeren » een SQL query om bij na te denken
Onderaan pagina
dannyboy 3.329
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 3.027
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 3.329
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 3.027
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 3.027
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 3.329
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 3.311
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 3.329
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 3.311
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 3.329
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)
 
Bovenaan pagina