/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
Udfordring: SQL select query
Fra : ///JJ


Dato : 14-04-04 22:17

Jeg sidder fast med et problem.

I en given tabel findes en række data:


Serie Nummer
1 1
1 2
1 3
1 osv....
1 24
1 25

Der er her i ekspemplet 25 rækker.
Opgaven går ud på at skrive et select statement der kan finde evt. manglende
numnre, fx. hvis nr. 5 ikke var med, så skulle resultatet være:

Manglende numre:
5

Der vil altid være maks 25 rækker i en serie, men der kan mangle ligeså
mange.

Jeg mangler nogle angrebsvinkler...... skal jeg igennem noget for-løkke
eller hvad?



Mvh
///JJ



 
 
///JJ (14-04-2004)
Kommentar
Fra : ///JJ


Dato : 14-04-04 22:22

///JJ wrote:
> Jeg sidder fast med et problem.

Glemte at nævne at det er MS SQL 7.
///JJ



Henrik Stidsen (14-04-2004)
Kommentar
Fra : Henrik Stidsen


Dato : 14-04-04 22:44

"///JJ" <nospam@tdcadsl.dk> wrote in
news:407daa73$0$201$edfadb0f@dread16.news.tele.dk

> Jeg mangler nogle angrebsvinkler...... skal jeg igennem noget
> for-løkke eller hvad?

Jeg vil nok vælge at lave en select * og så i det program der laver
udtrækket løbe dem igennem med en for lykke og notere alle dem der
mangler. Et godt trick er så at tælle hvor mange man får ud, hvis man
får 25 rækker ud så kan man jo konkludere at der ikke mangler nogen
og så sparer man gennemløbet - forudsat at der ikke kan være
dubletter.
Jeg tror ikke det kan gøres på andre måder.

--
..: Henrik Stidsen - http://hs235.dk/blog/ ::...
'Veni, Vidi, Velcro' - I came, I saw, I stuck around.

Jens Gyldenkærne Cla~ (14-04-2004)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 14-04-04 22:50

Henrik Stidsen skrev:

> Jeg tror ikke det kan gøres på andre måder.

Jo - hvis man laver en referencetabel med alle numre fra 1 til max-
værdien i serien. Så kan man finde hullerne med følgende join

SELECT r.id
FROM referencetabel r
LEFT JOIN serietabel t
ON r.id = t.id
WHERE t.id IS NULL
--
Jens Gyldenkærne Clausen
»Diplomatiet består netop i, at de gamle kommatister kan få lov til
at tro, at de har vundet. Men i virkeligheden har de tabt.«
Ole Togeby i Information

Henrik Stidsen (14-04-2004)
Kommentar
Fra : Henrik Stidsen


Dato : 14-04-04 23:20

Jens Gyldenkærne Clausen <jens@gyros.invalid> wrote in
news:Xns94CBF26FDE064jcdmfdk@gyrosmod.cybercity.dk

>> Jeg tror ikke det kan gøres på andre måder.
>
> Jo - hvis man laver en referencetabel med alle numre fra 1 til max-
> værdien i serien. Så kan man finde hullerne med følgende join

Tænkte godt nok på om ikke man kunne bruge noget med IS NOT NULL men
havde helt glemt den mulighed du nævner.

--
..: Henrik Stidsen - http://hs235.dk/blog/ ::...
'Veni, Vidi, Velcro' - I came, I saw, I stuck around.

Kristian Damm Jensen (15-04-2004)
Kommentar
Fra : Kristian Damm Jensen


Dato : 15-04-04 07:30

///JJ wrote:
> Jeg sidder fast med et problem.
>
> I en given tabel findes en række data:
>
>
> Serie Nummer
> 1 1
> 1 2
> 1 3
> 1 osv....
> 1 24
> 1 25
>
> Der er her i ekspemplet 25 rækker.
> Opgaven går ud på at skrive et select statement der kan finde evt.
> manglende numnre,


(a) Find slutpunktet for et hul
Altså: finde numre, hvor der findes tidligere numre, men hvor den
umiddelbart forrige ikke findes.

select * from T t1
where exists (select * from T t2 where t2.nummer < t1.nummer)
and not exists(select * from T t3 where t3.nummer +1 = t1.nummer)

(b) Find startpunktet for et hul

select * from T t4
where exists (select * from T t5 where t5.nummer > t4.nummer)
and not exists(select * from T t6 where t6.nummer +1 = t4.nummer)

(c) Kombiner de to

select t4.nummer+1 start
, t1.nummer-1 slut
from T t1, T t4
where exists (select * from T t2 where t2.nummer < t1.nummer)
and not exists(select * from T t3 where t3.nummer +1 = t1.nummer)
and exists (select * from T t5 where t5.nummer > t4.nummer)
and not exists(select * from T t6 where t6.nummer +1 = t4.nummer)

(c) har nu den ulempe, at hvis der findes flere intervaller med huller, vil
alle kombinationer af start og slut blivce vist, altså fx

Serien 1 6 10 giver
2, 5
2, 9
7, 5
7, 9

(d) Fjern kombinationer, hvor der findes noget mellem start og slut

select t4.nummer+1 start
, t1.nummer-1 slut
from T t1, T t4
where exists (select * from T t2 where t2.nummer < t1.nummer)
and not exists(select * from T t3 where t3.nummer +1 = t1.nummer)
and exists (select * from T t5 where t5.nummer > t4.nummer)
and not exists(select * from T t6 where t6.nummer +1 = t4.nummer)
and not exists
(select * from T t7
where t7.nummer between t4.nummer and t1.nummer)

> fx. hvis nr. 5 ikke var med, så skulle resultatet
> være:
>
> Manglende numre:
> 5

Ikke helt hvad du ønskede, men du kan muligvis bruge det alligevel.

--
Kristian Damm Jensen damm (at) ofir (dot) dk
Reality is that which, when you stop believing in it, doesn't go away.
-- Philip K. Dick


Søg
Reklame
Statistik
Spørgsmål : 177559
Tips : 31968
Nyheder : 719565
Indlæg : 6408937
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste