You need to use a number/tally table. (Plenty of examples on this site)egCREATE TABLE dbo.Numbers( Number smallint NOT NULL PRIMARY KEY CLUSTERED)DECLARE @i intSET @i = 1BEGIN TRANWHILE (@i <= 8000)BEGIN INSERT INTO dbo.Numbers SELECT @i SET @i = @i + 1ENDCOMMIT
Once you have a numbers table you can do something like the following:SELECT R.register_id, N.Number AS WeekNotMarkedFROM registers R JOIN dbo.Numbers N ON N.Number BETWEEN R.start_week AND R.end_week LEFT JOIN marked M ON R.register_id = M.register_id AND N.Number = M.[week]WHERE M.register_id IS NULL
orSELECT R.register_id, N.Number AS WeekNotMarkedFROM registers R JOIN dbo.Numbers N ON N.Number BETWEEN R.start_week AND R.end_weekWHERE NOT EXISTS ( SELECT * FROM marked M WHERE M.register_id = RM.register_id AND M.[week] = N.Number )