ОК, теперь я понимаю :-) Вы хотите найти значения objId
, у которых нет записи с датой 2010-05-01, а затем вставить дополнительные строки с этим objId, этой датой и значением NULL - используйте CTE (общее табличное выражение):
;WITH MissingObj AS
(
SELECT objId
FROM @datesTable d1
WHERE NOT EXISTS (SELECT objId FROM @datesTable d2 WHERE d2.objId = d1.objId AND d2.date = '20100501')
)
INSERT INTO @datesTable(objId, date, value)
SELECT
mo.objId, '20100501', NULL
FROM
MissingObj mo
CTE MissingObj
получает все значения objId
, где нет записи для '2010-05-01', а затем, используя этот список objId, следующий оператор INSERT вставляет их в вашу таблицу @datesTable
.
В качестве дополнительного примечания: я считаю, что этот подход намного проще для заполнения таблиц образцов:
declare @datesTable table (objId int, date smalldatetime, value int)
insert into @datesTable(objId, date, value)
VALUES(100, '20100401', 12),
(200, '20100501', 45),
(200, '20100401', 37),
(300, '20100501', 75) -- and so forth
SQL Server 2008 позволяет передавать несколько кортежей значений в (....) - гораздо проще и удобнее для чтения, чем конструкция объединения всех ...