DECLARE @TalmidID int, @TalmidName nvarchar(50), @msg nvarchar(50);

DECLARE my_cursor CURSOR FOR

SELECT TalmidID, TalmidName

FROM Talmidim

–WHERE TalmidStatus = 445

ORDER BY TalmidName;

OPEN my_cursor;

FETCH NEXT FROM my_cursor

INTO @TalmidID, @TalmidName;

WHILE @@FETCH_STATUS = 0

BEGIN

if @TalmidID=3211

begin

insert backuptalmidim(TalmidID,TalmidName)

values(@TalmidID,@TalmidName)

print ‘ עשיתי גיבוי ‘ + cast(@TalmidID as varchar)

end

else

begin

print ‘ לא עשיתי גיבוי לתלמיד – ‘ + cast(@TalmidID as varchar)

end

FETCH NEXT FROM my_cursor

INTO @TalmidID, @TalmidName;

END

CLOSE my_cursor;

DEALLOCATE my_cursor;

select * from backuptalmidim

go

delete backuptalmidim

דוגמא: הצג את רשימת החיסורים לכל תלמיד

פתרון 1 – JOIN :

SELECT   Talmidim.TalmidName, count(*) as Hisurim

FROM         Attendence INNER JOIN

                      Talmidim ON Attendence.TalmidID = Talmidim.TalmidID

where WasHeThere=0

group by Talmidim.TalmidName

 

פתרון 2 – תת-שאילתה:

select  Talmidim.TalmidName ,

(select count(*)

            from Attendence

            where WasHeThere=0

            and Talmidim.TalmidID=Attendence.TalmidID

      ) as Hisurim

 

from  Talmidim

פתרון 3 – JOIN עם תת-שאילתה:

select  Talmidim.TalmidName ,count (Hisurim.LectureID)

from  Talmidim

      join

                  (select TalmidID, LectureID

                        from Attendence

                        where WasHeThere=0

                  ) as Hisurim

            on Talmidim.TalmidID=Hisurim.TalmidID

group by TalmidName

 

פתרון 4 – שידרוג לפתרון 2 – מורידים שורות עם אפסים:

select  Talmidim.TalmidName ,(select count(*) as aaa

                                                      from Attendence

                                                      where WasHeThere=0

                                                            and Talmidim.TalmidID=Attendence.TalmidID

                                                ) as Hisurim

from  Talmidim

where TalmidID in

                  (select TalmidID

                        from Attendence

                        where WasHeThere=0

                  )

 

 

פתרון 5 – טבלה זמנית:

select TalmidID,count(*) as hisurim

      into #temp 

      from Attendence

      where WasHeThere=0

      group by TalmidID

————————————–                     

select  TalmidName ,isnull((select hisurim from #temp where #temp.TalmidID=tt.TalmidID),0)

from  Talmidim tt

————————————–

select  TalmidName ,hisurim

from  Talmidim tt

       join #temp on #temp.TalmidID=tt.TalmidID

     

 

 

פתרון 6 – פונקציה סקלארית:

alter function dbo.HisurimByTalmidID

(

      @Tid int

)

returns int

as

begin

      declare @tozaa int

            set @tozaa = (select count(*) as hisurim

                                    from Attendence

                                    where WasHeThere=0

                                          and @Tid=Attendence.TalmidID

                              )

      return @tozaa

end

go

select  TalmidName, dbo.HisurimByTalmidID(TalmidID)

from  Talmidim

 

פתרון 7 – פונקציית טבלה פשוטה:

create function dbo.HisurimAllTalmidim()

returns table

as

return (

            select TalmidID,count(*) as hisurim

                                    from Attendence

                                    where WasHeThere=0

            group by Attendence.TalmidID

      )

go

 

select  TalmidName, sss.hisurim

from  Talmidim

      join dbo.HisurimAllTalmidim() as sss

            on Talmidim.TalmidID = sss.TalmidID

 

 

פתרון 8 – פונקציה מורכבת:

alter function dbo.HisurimAllTalmidim2()

returns @tozaa table

(

      TalmidID int,

      hisurim int

)

as

begin

            insert @tozaa(TalmidID,hisurim)

                  select TalmidID,count(*)

                                          from Attendence

                                          where WasHeThere=0

                  group by Attendence.TalmidID

            return

end

go ——————————————————-

select  TalmidName, sss.hisurim

from  Talmidim

      join dbo.HisurimAllTalmidim() as sss

            on Talmidim.TalmidID = sss.TalmidID

 

 

select

(case TalmidID when 1346 then ‘YYY’ else ‘NO’ end) as Stam ,* from dbo.Talmidim

 

CREATE TABLE Names�
(�
    NameID INT IDENTITY(1, 1)�
        PRIMARY KEY CLUSTERED,�
    FName VARCHAR(32)�
)�
GO�

SET NOCOUNT ON�
INSERT Names(FName) VALUES(‘Aaron’)�
INSERT Names(FName) VALUES(‘Greg’)�
INSERT Names(FName) VALUES(‘Alex’)�
INSERT Names(FName) VALUES(‘Luan’)�
INSERT Names(FName) VALUES(‘John’)�
INSERT Names(FName) VALUES(‘Todd’)�
INSERT Names(FName) VALUES(‘Scott’)�
INSERT Names(FName) VALUES(‘Jess’)�
INSERT Names(FName) VALUES(‘Drew’)�
INSERT Names(FName) VALUES(‘Katherine’)�
INSERT Names(FName) VALUES(‘Paul’)�
GO�

– solution #1: nested top�

SELECT TOP 1 FName�
FROM�
(�
    SELECT TOP 10 FName�
    FROM Names�
    ORDER BY FName�
) sub�
ORDER BY FName DESC�

– solution #2: NOT IN�

SELECT TOP 1 FName �
FROM Names WHERE FName NOT IN�
(�
    SELECT TOP 9 FName�
    FROM Names�
    ORDER BY FName�
)�
ORDER BY FName�

– solution #3: derived count�
– this assumes FName is unique�

SELECT FName�
    FROM Names�
    WHERE �
    (�
        SELECT COUNT(*)�
        FROM Names n2�
        WHERE n2.FName <= Names.FName�
    ) = 10�

– solution #4: MAX�

SELECT FName = MAX(FName) FROM �
(�
    SELECT TOP 10 FName�
    FROM Names�
    ORDER BY FName�
) sub�

– solution #5: relative fetch from cursor�

– yes, cursors are generally evil, but�
– sometimes you might be surprised�

DECLARE FNames CURSOR�
    LOCAL STATIC READ_ONLY FOR�
    SELECT FName�
        FROM Names�
        ORDER BY FName�

DECLARE @FName VARCHAR(32)�

OPEN FNames�

FETCH RELATIVE 10 FROM FNames INTO @FName�

CLOSE FNames�
DEALLOCATE FNames�

SELECT FName = @FName�

DROP TABLE Names�
GO