Обновить значение строки, если запись не найдена в другой базе данных - PullRequest
0 голосов
/ 12 января 2020

Я очень новичок в SQL. Мне нужна помощь в том, как обновить «AH_Field» в базе данных sx_appmts.db, в таблице «Sx_Appmts_table» со значением «No Show», когда я не нахожу запись в sx_services_db, в таблице sx_services_table.

Этот код работает нормально, когда находит совпадение и помещает значение «Done» в AH_Field, однако я хотел поместить значение «No Show», когда совпадение не найдено.

UPDATE S
SET [AH_Field] = 'Done' 
FROM [SX_Appmts_Db].[dbo].[Sx_Appmts_Table] S 
INNER JOIN [SX_Services_db].[dbo].[Sx_Services_Table] D ON S.[AA_field] = D.[WK_Field] 
WHERE S.[AH_Field] LIKE 'Scheduled' AND
      S.[AA_Field] = D.[WK_Field] AND
      S.[AK_Field] IS NOT NULL AND 
      S.[AQ_Field] IS NOT NULL AND 
      CONVERT(VARCHAR(10), S.[AK_Field], 101) = CONVERT(VARCHAR(10), D.[DV_Field], 101) AND 
      CONVERT(VARCHAR(10), S.[AQ_Field], 101) = CONVERT(VARCHAR(10), D.[AD_Field], 101) AND 
      S.[AD_Field] LIKE D.[AA_Field]

Ответы [ 2 ]

0 голосов
/ 13 января 2020

Важным моментом является LEFT JOIN, но я бы внес несколько изменений в запрос:

UPDATE S
    SET AH_Field = (CASE WHEN ST.WK_Field IS NOT NULL THEN 'Done' ELSE 'No Show' END)
    FROM [SX_Appmts_Db].[dbo].[Sx_Appmts_Table] S LEFT JOIN
         [SX_Services_db].[dbo].[Sx_Services_Table] ST
         ON S.[AA_field] = ST.[WK_Field] AND
            CONVERT(DATE, S.AK_Field) = CONVERT(DATE, ST.DV_Field) AND 
            CONVERT(DATE, S.AQ_Field) = CONVERT(DATE, ST.AD_Field) AND 
           S.AD_Field LIKE ST.AA_Field
WHERE S.[AH_Field] = 'Scheduled';

Примечания:

  • Нет необходимости указывать имена столбцов в квадратных скобках, если только они не должны быть в кавычках (а наличие кавычек идентификаторов означает, что у вас неверный выбор идентификатора).
  • D -> ST, сокращение от имени таблицы.
  • Нет необходимости повторять сравнение S.[AA_Field] = D.[WK_Field].
  • LIKE 'Scheduled' в значительной степени эквивалентно = 'Scheduled', но последний более понятен в намерениях.
  • Сравнение дат лучше всего использовать функции даты, а не строки.
  • Сравнение с NULL излишне. Сравнения на равенство уже отфильтровывают значения NULL.
0 голосов
/ 12 января 2020

Используйте LEFT JOIN вместо INNER JOIN, потому что вы хотите, чтобы и несопоставленные строки тоже и CASE выражение или IIF() обновляли столбец:

UPDATE S 
SET [AH_Field] = IIF(D.[WK_Field] IS NULL, 'No Show', 'Done') 
FROM [SX_Appmts_Db].[dbo].[Sx_Appmts_Table] S LEFT JOIN [SX_Services_db].[dbo].[Sx_Services_Table] D 
ON    S. [AA_field] = D.[WK_Field] 
  AND S.[AA_Field] = D.[WK_Field]
  AND S.[AD_Field] LIKE D.[AA_Field]
  AND convert(varchar(10), S.[AK_Field], 101) = convert(varchar(10), D.[DV_Field], 101) 
  AND convert(varchar(10), S.[AQ_Field], 101) = convert(varchar(10), D.[AD_Field], 101) 
WHERE S.[AH_Field] LIKE 'Scheduled' AND S.[AK_Field] IS NOT NULL AND S.[AQ_Field] IS NOT NULL 

Условия, которые у вас были в предложении WHERE, включающем столбцы из таблицы, [Sx_Services_Table] перемещаются в предложение ON, чтобы сохранить целостность LEFT JOIN. Также я не вижу причины для оператора LIKE в этом состоянии:

S.[AH_Field] LIKE 'Scheduled'

Вы можете использовать = вместо LIKE.

...