2015-05-11 4 views
1

У меня есть две одинаковые таблицы, одна со всеми данными, а другая содержит подмножество первого. Каждые 2-3 дня мне нужно вставить во второй таблице недостающих значений, и я использую этот кодТаблица обновления SQL-сервера с отсутствующими значениями

INSERT INTO [SRVDB2].[dbt].[curve].[curve_value] 
SELECT * 
FROM [SRVDB1].[dbt].[curve].[curve_value] as DB01 
WHERE TargetDate >= '20150505' 
    and NOT EXISTS (SELECT * 
     FROM [SRVDB2].[dbt].[curve].[curve_value] as DB02 
     WHERE DB02.TargetDate = DB01.TargetDate 
      and DB02.[Hour] = DB01.[Hour] 
      and DB02.[id_Mkt] = DB01.[id_Mkt] 
      and DB02.[Price] = DB01.[Price] 
      and DB02.VoSe = DB01.VoSe 
      and DB02.VoBu = DB01.VoBu 
    ) 

Он всегда работал, но теперь у меня есть несколько строк с NULL в колонке VoSe или VoBu и эти значения не являются (даже если выполнение только инструкции SELECT, похоже, возвращает все различия). Как я могу справиться с этим?

ответ

3

Добавить явную проверку на NULL для обоих этих столбцов:

INSERT INTO [SRVDB2].[dbt].[curve].[curve_value] 
SELECT * 
FROM [SRVDB1].[dbt].[curve].[curve_value] as DB01 
WHERE TargetDate >= '20150505' 
    and NOT EXISTS (SELECT * 
     FROM [SRVDB2].[dbt].[curve].[curve_value] as DB02 
     WHERE DB02.TargetDate = DB01.TargetDate 
      and DB02.[Hour] = DB01.[Hour] 
      and DB02.[id_Mkt] = DB01.[id_Mkt] 
      and DB02.[Price] = DB01.[Price] 
      and ((DB02.VoSe IS NULL AND DB01.VoSe IS NULL) OR DB02.VoSe = DB01.VoSe) 
      and ((DB02.VoBu IS NULL AND DB01.VoBu IS NULL) OR DB02.VoBu = DB01.VoBu) 
    ) 
+0

мне нужно добавить скобки '((DB02.VoSe IS NULL И DB01.VoSe IS NULL) ИЛИ DB02.VoSe = DB01.VoSe) 'и код работал нормально, спасибо – Naigel

+0

@Naigel Спасибо, что заметили отсутствующие скобки, я обновил ответ – dotnetom

1

Используйте ISNULL для обработки значений NULL.

ПРИМЕЧАНИЕ. Используйте произвольное значение в функции ISNULL, которое не будет находиться в этих двух столбцах. Например я сохранил «ААА»

SELECT * 
FROM [SRVDB1].[dbt].[curve].[curve_value] as DB01 
WHERE TargetDate >= '20150505' 
    and NOT EXISTS (SELECT * 
     FROM [SRVDB2].[dbt].[curve].[curve_value] as DB02 
     WHERE DB02.TargetDate = DB01.TargetDate 
      and DB02.[Hour] = DB01.[Hour] 
      and DB02.[id_Mkt] = DB01.[id_Mkt] 
      and DB02.[Price] = DB01.[Price] 
      and ISNULL(DB02.VoSe,'AAA') = ISNULL(DB01.VoSe,'AAA') 
      and ISNULL(DB02.VoBu,'AAA') = ISNULL(DB01.VoBu,'AAA') 
    ) 
+0

это, кажется, быстрее, чем @dotnetom решение – Naigel

2

@ ответ dotnetom в (+1) должны работать для вашей проблемы. Тем не менее, сделать некоторые предположения о проблеме вы описываете, я подозреваю, что следующий будет работать так же хорошо:

INSERT INTO [SRVDB2].[dbt].[curve].[curve_value] 
SELECT * 
FROM [SRVDB1].[dbt].[curve].[curve_value] 
WHERE TargetDate >= '20150505' 
EXCEPT SELECT * 
FROM [SRVDB2].[dbt].[curve].[curve_value] 
+0

У меня также столбец TimeStamp, поэтому этот код не будет работать в моем конкретном случае. – Naigel

+0

Это убийца сделок. –

Смежные вопросы