[ captPicard @ 14.10.2010. 07:59 ] @
Ovaj query vraća prvi broj u nizu koji nedostaje

Code:
select (a.broj + 1)
from tablica a
where not exists
(select 1
from tablica b
where b.broj = (a.broj + 1))
order by 1


Ako je niz npr.

Code:
1, 2, 4, 5, 6


rezultat će biti 3. Međutim, ako je niz

Code:
2, 3, 5, 6, 7


rezultat će vratiti 4 a ne 1 koji je ustvari prvi broj koji nedostaje u nizu.

Ima li netko rješenje?

Hvala!
[ Zoran.Eremija @ 14.10.2010. 09:11 ] @
TabelaA
BrojA
1
2
3
4
5
6
7
8
9
10

TabelaB
BrojB
2
3
5
6
7

Brojevi koji nedostaju

SELECT TabelaA.BrojA
FROM TabelaA LEFT JOIN TabelaB ON TabelaA.BrojA = TabelaB.BrojB
WHERE (((TabelaB.BrojB) Is Null))
ORDER BY TabelaA.BrojA;

Prvi broj koji nedostaje...

SELECT TOP 1 TabelaA.BrojA
FROM TabelaA LEFT JOIN TabelaB ON TabelaA.BrojA = TabelaB.BrojB
WHERE (((TabelaB.BrojB) Is Null))
ORDER BY TabelaA.BrojA;
[ captPicard @ 14.10.2010. 09:39 ] @
Hvala Zoran, za to rješenje znam, ali želio bih izbjeći temp tablicu. Došao sam do rješenja u međuvremenu sa UnionAll, ali pustit ču još otvoreno, možda netko da bolje rješenje.
[ mish_ns @ 14.10.2010. 12:00 ] @
Ovako ide za interbase. Pretpostavljam da ima nesto slicno ROWS u drugim bazama.(TOP....)

SELECT
(A.BROJ-1)
FROM
TABLICA A
WHERE
NOT exists (SELECT 1 FROM TABLICA B WHERE B.BROJ = (A.BROJ-1))
AND (A.BROJ NOT IN (SELECT max(C.BROJ) FROM TABLICA C))
ROWS 1

Mada iskreno, nije mi jasno bas kako ovaj upit radi, sta se tu prvo izvrsava...
Kad napisem samo:
select 1 from tablica where a=b+1

u setu dobijem 1 kao rezultat...
ako stavim select 10 dobijem 10 kao rezultat.

[ mish_ns @ 14.10.2010. 13:08 ] @
Ne treba ovaj deo:
AND (A.BROJ NOT IN (SELECT max(C.BROJ) FROM TABLICA C))
svakako sa ROWS 1 uzimas samo prvi br. iz seta (prethodno mora biti sortiran)


SELECT
(a.broj-1) AS NEDOSTAJE
FROM
TABLICA a
WHERE
NOT exists (SELECT b.broj FROM TABLICA b WHERE (b.broj = a.broj -1))
AND a.broj-1 not in (0)
ORDER BY a.broj
rows 1

Mislim da bi sa TOP islo ovako:
SELECT TOP (a.broj-1)
FROM
TABLICA a
WHERE
NOT exists (SELECT b.broj FROM TABLICA b WHERE (b.broj = a.broj -1))
AND a.broj-1 not in (0)
ORDER BY a.broj

i za druge baze postoji LIMIT....

Nadam se da je ista pomoglo....
[ captPicard @ 14.10.2010. 13:23 ] @
Hvala obojici, elegantno i efikasno rješenje!