[ djvlajko @ 28.06.2013. 10:51 ] @
Moze li se napisati sql izraz za izdvajanje prvih 500 prirodnih brojeva, a da se pri tome ne koristi neka tabela iz neke baze podataka.

Ovo mi treba za Sql2008 ...

Hvala ...
[ vujkev @ 28.06.2013. 11:04 ] @
Odakle da ih izdvojiš ako te podatke nemaš u tabeli?

Mislio si nešto ovako?
Code (tsql):
with e as (
     select 1 rn
     union all
     select rn+1 from e
     where rn<500
)
select * from e
OPTION (MAXRECURSION 500);
[ djvlajko @ 28.06.2013. 12:43 ] @
Sta je moj konkretan zadatak ...

U tabeli uzorak, po odgovarajucem kriterijumu izdvajam kolonu broj_u_danu i tu ce biti npr 1, 2, 4, 5, 6, 9 ....

Hteo bih da nadjem najmanji propusteni broj. Ja sam za to koristio pomocnu tabelu brojevi, sa jednom kolonom broj, koja ima 500 slogova (od 1 do 500) i uz pomoc donjeg upita dobijao rezultat kao vrednost mindan.



Code:
 select min(broj) as mindan from brojevi where broj not in (select uzorak.broj_u_danu from uzorak where ...) 



Ne znam da li sam dovoljno jasan sa ovim kodom ...

Svakako Vam hvala na odgovoru.

[ Zidar @ 28.06.2013. 18:51 ] @
Na brzinu, problem moze da se resi ovako:
Code:

-- Ovo ti da SVE nedostajuce brojeve:
SELECT B.broj 
FROM Brojevi AS B
LEFT JOIN Uzorak AS U ON U.broj_u_danu = B.broj
;

-- onda izaberes najmanji od njih:
SELECT MIN(broj)
FROM 
(
SELECT B.broj 
FROM Brojevi AS B
LEFT JOIN Uzorak AS U ON U.broj_u_danu = B.broj
) AS X
;


Umesto tabele Brojevi mozes da koristis onaj elegantni izraz sto ti je dao Vujkev, samo promenis MAXRECURSION i ono rn<500, podesis kako tebi treba.

Diskusija ponudjenog resenja:
Ako je tabela Brojevi velika, recimo deset miliona brojeva, ond ce prvi kveri (LEFT JOIN) da vrati sve brojeve koji su u tabeli Brojevi, znaci i one vece od najveceg u tabeli Uzorak. Za 500 brojeva nema veze, ali za vise moze biti problem. Jos veci je problem sto se moze desiti da nemas ni jedna 'propusteni broj' u tabeli uzorci, a da ponudjeni kveri ipak vrati nesto - sve borjeve vece od najvece vrednosti U.broj_u_danu. Kveri koji nema ove nedostatke izgledao bi ovako:
Code:

SELECT MIN(broj)
FROM 
(
SELECT B.broj 
FROM Brojevi AS B
LEFT JOIN Uzorak AS U ON U.broj_u_danu = B.broj
WHERE B.broj <= (SELECT MAX(broj_u_danu) FROM Uzorak)
) AS X
;

Tako nekako otprilike. Verujem da ces se snaci za dalje.

Srecn rad
[ djvlajko @ 28.06.2013. 20:50 ] @
Pogledao sam drugi kod koji Ste mi poslali (Zidar).

Taj kod uvek vraca 1. Sa left join-om cu dobiti sve brojeve od 1 pa do maksimalnog broja u tabeli uzorak. Zatim sa min(broj) dobijam najmanji tj 1 ???

Napravio sam malu testnu bazu u Access-u i upravo je tako ......


U svako slucaju mislim da ce mi kod koji je dao Vujke pomoci (probao sam i on odradjuje sta treba).

Jos jednom se zahvaljujem na pomoci i veliki pozdrav .....



[ dusans @ 28.06.2013. 22:11 ] @
Ako nemaš puno ponavljanja u koloni broj_u_danu onda ovako:
Code:

SELECT TOP 1 (T.broj_u_danu + 1) AS mindan
FROM uzorak AS T LEFT OUTER JOIN uzorak AS S ON T.broj_u_danu + 1 = S.broj_u_danu
WHERE (S.broj_u_danu IS NULL)
ORDER BY T.broj_u_danu


Ako imaš puno ponavljanja u koloni broj_u_danu onda bolje ovako:
Code:

SELECT TOP 1 (T.broj_u_danu + 1) AS mindan
FROM (SELECT DISTINCT broj_u_danu FROM uzorak) AS T 
LEFT OUTER JOIN (SELECT DISTINCT broj_u_danu FROM uzorak) AS S ON T.broj_u_danu + 1 = S.broj_u_danu
WHERE (S.broj_u_danu IS NULL)
ORDER BY T.broj_u_danu


Pozdrav!

[Ovu poruku je menjao dusans dana 28.06.2013. u 23:32 GMT+1]
[ djvlajko @ 29.06.2013. 00:11 ] @
Dusans, ovo radi ali gresi samo u slucaju kada je prvi broj u uzorcima 2 (tj nedostaje 1).

Malo je kasno, sutra cu probati da "provalim" i tu varijantu.

Puno hvala ...
[ Zidar @ 04.07.2013. 14:29 ] @
Izvinjavam se, moj kveri je nepotpun (kad vec nisi prilozio tabelu sa test podacima pa moramo da pisemo napamet...)
Ponovo, napamet
Code:

SELECT MIN(broj)
 FROM 
 (
 SELECT B.broj 
 FROM Brojevi AS B
 LEFT JOIN Uzorak AS U ON U.broj_u_danu = B.broj
 WHERE B.broj <= (SELECT MAX(broj_u_danu) FROM Uzorak) -- dovde vraca SVE iz atbele Brojevi
AND U.broj IS NULL    -- ovo zadrazva samo one brojeve koji nedostajuu tabelio Uzorak
 ) AS X
 ;


Ono sto ti je dusans dao je veoma dobro, ali mozda je teze za razumevanje.