• wendy elizabeth (7/17/2016)


    What other sql options are you thinking that would work?

    I did not include all my question since I was trying to determine what was wrong with my original sql. I thought the too many rows was causing my problem.

    Here is my original sql:

    declare @gradYear int = 2017

    SELECT distinct graduation.personID

    into #gradPersonID

    FROM [TEST].[dbo].[Graduation] graduation

    where graduation.gradyear = @gradYear

    SELECT distinct personID

    FROM #gradPersonID graduation

    where personID NOT in

    (select distinct TranscriptCourse.personID from #gradPersonID graduation

    join [TEST].[dbo].[TranscriptCourse] TranscriptCourse

    on TranscriptCourse.personID = graduation.personID

    where TranscriptCourse.grade between '09' and '12'

    and @gradYear - 4 = TranscriptCourse.endYear)

    DROP table #gradPersonID

    Quick thoughts, this is quite a different problem from the one you originally posted, can I ask why you didn't post the full problem up front? This way you are wasting everyone's time.

    Further, the solution you posted is not very efficient, lots of unnecessary IO, table scans and is far too complicated for such a simple task.

    😎

    Here is a quick suggestion towards a solution, cannot say anything else as I don't know if the problem we are trying to solve is going to change yet again.

    USE TEEST;

    GO

    SET NOCOUNT ON;

    --/*

    IF OBJECT_ID(N'dbo.TranscriptCourse') IS NOT NULL DROP TABLE dbo.TranscriptCourse;

    CREATE TABLE dbo.TranscriptCourse

    (

    transcriptID int IDENTITY(1,1) NOT NULL CONSTRAINT PK_DBO_TranscriptCourse_transcriptID PRIMARY KEY CLUSTERED

    ,personID int NOT NULL

    ,startYear smallint NULL

    ,endYear smallint NULL

    ,grade CHAR(2) NULL

    )

    IF OBJECT_ID(N'dbo.Graduation') IS NOT NULL DROP TABLE dbo.Graduation;

    CREATE TABLE dbo.Graduation

    (

    GraduationID int IDENTITY(1,1) NOT NULL CONSTRAINT PK_DBO_GRADUATION_GRADUATIONID PRIMARY KEY CLUSTERED

    ,personID int NOT NULL

    ,gradyear INT NULL

    )

    -- SAMPLE DATA GENERATION dbo.TranscriptCourse

    ;WITH T(N) AS (SELECT X.N FROM (VALUES (0),(0),(0),(0),(0),(0),(0),(0),(0),(0))AS X(N))

    , NUMS(N) AS (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS N FROM T T1,T T2,T T3,T T4)

    ,PERSON_AND_START_YEAR AS

    (

    SELECT

    ABS(CHECKSUM(NEWID())) % 1000 AS PERSON_ID

    ,(ABS(CHECKSUM(NEWID())) % 100) + 1950 AS START_YEAR

    ,CONVERT(VARCHAR(2),(ABS(CHECKSUM(NEWID())) % 12) + 1,0) AS GRADE

    FROM NUMS NM

    )

    INSERT INTO dbo.TranscriptCourse(personID,startYear,endYear,grade)

    SELECT

    PASY.PERSON_ID

    ,PASY.START_YEAR

    ,PASY.START_YEAR + (ABS(CHECKSUM(NEWID())) % 100) AS END_YEAR

    ,STUFF('00',3 - LEN(PASY.GRADE),LEN(PASY.GRADE),PASY.GRADE) AS GRADE

    FROM PERSON_AND_START_YEAR PASY;

    -- SAMPLE DATA GENERATION dbo.Graduation

    ;WITH T(N) AS (SELECT X.N FROM (VALUES (0),(0),(0),(0),(0),(0),(0),(0),(0),(0))AS X(N))

    , NUMS(N) AS (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS N FROM T T1,T T2,T T3,T T4)

    ,PERSON_GRADE AS

    (

    SELECT

    ABS(CHECKSUM(NEWID())) % 1000 AS PERSON_ID

    ,CONVERT(VARCHAR(2),(ABS(CHECKSUM(NEWID())) % 12) + 1,0) AS GRADE

    FROM NUMS NM

    )

    INSERT INTO dbo.Graduation(personID,gradyear)

    SELECT

    PEGR.PERSON_ID

    ,(ABS(CHECKSUM(NEWID())) % 100) + 1954 AS GRAD_YEAR

    FROM PERSON_GRADE PEGR;

    CREATE NONCLUSTERED INDEX NCLIDX_DBO_TRANSCRIPTCOURSE_ENDYEAR_GRADE_INCL_PERSONID ON dbo.TranscriptCourse(endYear ASC,grade ASC) INCLUDE (personID);

    CREATE NONCLUSTERED INDEX NCLIDX_DBO_GRADUATION_GRADYEAR_PERSONID ON dbo.Graduation(gradyear ASC,personID);

    --*/

    declare @gradYear int = 2017

    RAISERROR ('CTE SOLUTION',0,0) WITH NOWAIT;

    SET STATISTICS IO,TIME ON;

    ;WITH EXCLUSION_SET AS

    (

    SELECT

    TC.personID

    FROM dbo.TranscriptCourse TC

    WHERE TC.endYear = @gradYear - 4

    AND TC.grade IN ('09','10','11','12')

    )

    SELECT

    GR.personID

    FROM dbo.Graduation GR

    WHERE GR.gradyear = @gradYear

    AND GR.personID NOT IN (SELECT ES.personID FROM EXCLUSION_SET ES)

    GROUP BY GR.personID;

    SET STATISTICS TIME,IO OFF;

    RAISERROR ('TEMP TABLE SOLUTION',0,0) WITH NOWAIT;

    SET STATISTICS IO,TIME ON;

    SELECT distinct graduation.personID

    into #gradPersonID

    FROM dbo.Graduation graduation

    where graduation.gradyear = @gradYear

    SELECT distinct personID

    FROM #gradPersonID graduation

    where personID NOT in

    (select distinct TranscriptCourse.personID from #gradPersonID graduation

    join dbo.TranscriptCourse TranscriptCourse

    on TranscriptCourse.personID = graduation.personID

    where TranscriptCourse.grade between '09' and '12'

    and @gradYear - 4 = TranscriptCourse.endYear)

    DROP table #gradPersonID

    SET STATISTICS TIME,IO OFF;

    Statistics for the CTE query

    CTE SOLUTION

    Table 'Graduation'. Scan count 1, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

    Table 'TranscriptCourse'. Scan count 4, logical reads 8, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

    SQL Server Execution Times: CPU time = 16 ms, elapsed time = 1 ms.

    Statistics for the temp table query

    TEMP TABLE SOLUTION

    SQL Server parse and compile time: CPU time = 8 ms, elapsed time = 8 ms.

    Table 'Graduation'. Scan count 1, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

    SQL Server Execution Times: CPU time = 0 ms, elapsed time = 4 ms.

    SQL Server parse and compile time: CPU time = 44 ms, elapsed time = 44 ms.

    Table '#gradPersonID_______________________________________________________________________________________________________00000000000D'. Scan count 2, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

    Table 'Workfile'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

    Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

    Table 'TranscriptCourse'. Scan count 1, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

    SQL Server Execution Times: CPU time = 0 ms, elapsed time = 3 ms.

    SQL Server Execution Times: CPU time = 0 ms, elapsed time = 2 ms.