1

Konu: SQL ile eksik numarayı bulmak

Merhabalar

Bir tablodada sürekli birilerin oda numarası değişiyor. Yeni numara vermek için MAX() ile son numarayı buldukdan sonra, üzerine bir ekliyerek işimi görüyordum.
Belli bir süre sonra tabii oda numaralar anlamsız büyümeye başladı, çünkü silinmiş değeri küçük numaralar tekrar kullanılmiyordu.

Belki bir gün birisinin işine yarar:

SQL
SELECT L.room_nr + 1 AS missed_nr

FROM   KO_Kisiler AS L
       LEFT JOIN KO_Kisiler AS R
       ON (L.room_nr + 1 = R.Room_nr)
WHERE  R.room_nr IS NULL AND L.room_nr > 1000 AND L.room_nr < 2000 ORDER BY missed_nr
Bir projenin bitmesi için 3 seçenek vardır: hızlı, ucuz, iyi. Bu seçeneklerden iki tanesini seçiniz.

2 Son düzenleyen, konuka (06.06.2012 13:05:14)

Re: SQL ile eksik numarayı bulmak

JOINde
ON (L.room_nr + 1 = R.Room_nr) bilmiyordum,
güzel teknik :
- hatta listede boş yoksa en alttan sıradakini getiriyor
- ancak 1 (olabilecek en ufak no) boş ise onu görmüyor

özellikle SP olarak kullanarak çok kullanıcılarda ve uzak sorgulamalarda şanssızlıklar (!) ortadan kalkacağını düşünüyorum.

teşekkürler

VFP9 SP2

3

Re: SQL ile eksik numarayı bulmak

Bence daha basit ve kullanisli bir teknik Tally tablosu kullanmak. Tally tablosu integer ve tarih degerleri icin onceden bir kere yaratilmis tablolar. Joinlerde ise yariyor. Onceden yaratilmamissa bile SQL server'in knedi var olan tablolari sayesinde yaratilmasi milisaniye duzeyinde. Ornek:

SQL
WITH    Tally ( N )

          AS ( SELECT TOP 100000
                        ROW_NUMBER() OVER ( ORDER BY t1.Object_ID ) AS N
               FROM     Master.sys.All_Columns t1 ,
                        Master.sys.All_Columns t2
             )
    SELECT  MIN(N)
    FROM    Tally
    WHERE NOT EXISTS ( SELECT 1  FROM  KO_Kisiler  WHERE  room_nr = tally.N )

Bazen varolan tablonun icinde onceden var olan degerler belli bir numaradan basliyor (1 den degil) ve belli bir yerde bitiyor. Bu aralikta kullanilmayan en kucuk ya da hepsi gerekirse:

SQL
WITH    Tally ( N )

          AS ( SELECT TOP 100000
                        ROW_NUMBER() OVER ( ORDER BY t1.Object_ID ) AS N
               FROM     Master.sys.All_Columns t1 ,
                        Master.sys.All_Columns t2
             )
    SELECT  N                   -- ya da ilki icin Min(N)
    FROM    Tally
    WHERE
       N BETWEEN (SELECT min(room_nr) FROM KO_Kisiler) AND (SELECT max(room_nr) FROM KO_Kisiler)
       AND NOT EXISTS ( SELECT 1  FROM  KO_Kisiler  WHERE  room_nr = tally.N )

Tally'i seviyorum:) Tarihlerle de son derece zor isleri kolay yapiyor. Ornegin: X tarihi ile Y tarihi arasinda kac tane Pazar var?

SQL
DECLARE @pazar INT;

SET @pazar = DATEPART(weekday, '2012/7/8');
 
WITH    Tally ( myDate )
          AS ( SELECT   DATEADD(d, N - 1, '2000/1/1')
               FROM     ( SELECT TOP 100000
                                    ROW_NUMBER() OVER ( ORDER BY t1.Object_ID ) AS N
                          FROM      Master.sys.All_Columns t1 ,
                                    Master.sys.All_Columns t2
                        ) tmp
             )
    SELECT  COUNT(*)
    FROM    Tally
    WHERE   myDate BETWEEN '2010/1/1' AND GETDATE()
            AND DATEPART(weekday, myDate) = @pazar;

4

Re: SQL ile eksik numarayı bulmak

Üstat, yine döktürmüşsün smile
Aklına, Ellerine Sağlık ...

Uğur
-------------------------------------------------------------------------------------------------------------
Hayat bir bisiklete binmek gibidir. Pedalı çevirmeye devam ettiğiniz sürece düşmezsiniz. Claude Peppeer
Kusuru söylenmeyen adam, ayıbını hüner sanır.  Türk Atasözü

5

Re: SQL ile eksik numarayı bulmak

Istemeden oldu. Fox4um son zamanlarda garip davranıyor. Durup duruken atıyor filan. Tekrar girince önüme düştü ben de yeni sandım ama sonra farkettim eskiymiş:)