Обновление таблицы — используйте один столбец для обновления другого

#sql #sql-server #tsql #sql-server-2016

Вопрос:

У меня есть стол, который выглядит так:

Таблица 1

 Val1    Val2       Type     Date          Key
NULL    110.1      T        11/30/2020    174
NULL    205.5      D        12/31/2020    133
NULL    360.7      T        11/30/2020    190
 

Ключ в данном случае уникален. Что я хочу сделать, так это установить Val1 = Val2, где Тип= «T» и дата = «11/30/2020»

Правильно ли это выглядит?

  Update t1
 set t1.Val1 = t2.Val2
 From Table1 t1
 JOIN Table1 t2
      on t1.Key = t2.Key
 Where t1.type='T' and t1.Date = '11/30/2020'
 

Желаемые результаты:

 Val1     Val2       Type     Date          Key
110.1    110.1      T        11/30/2020    174
NULL     205.5      D        12/31/2020    133
360.7    360.7      T        11/30/2020    190
 

Комментарии:

1. Сработало ли это? Странно, что вы спрашиваете нас, а не просто пытаетесь это сделать.

2. «Правильно ли это выглядит?» Почему бы не запустить запрос и не выяснить, работает ли он? или запустите инструкцию в качестве SELECT первого, чтобы вы могли видеть, какие строки будут обновлены, и какие новые значения будут присвоены. Вы находитесь в гораздо лучшем положении, чтобы проверить это у нас, у которых нет доступа к вашему экземпляру.

3. Просто примечание, я вижу, что столбцы могут быть обнулены. Возможно, вы захотите проверить использование на недействительность IS NULL . Равенство с нулем немного неинтуитивно, например, значение NULL = NULL может быть равно FALSE . Один из способов избежать этого — set ansi_nulls on

4. @prnvbn Предположительно вы имели в виду set ansi_nulls off , что это только для обратной совместимости, и есть ряд вещей, которые вы не можете сделать, когда это так off . Вы можете счесть это неинтуитивным, но именно так должен использоваться SQL.

Ответ №1:

Я не думаю, что тебе нужна join :

 update table1
    Set Val1 = Val2
    where Type='T' and Date = '2020-11-30';
 

Примечание: Я рекомендую использовать даты в стандартных форматах, поэтому увядайте '2020-11-30' или '20201130' .

Комментарии:

1. Если операция использует более старые типы данных даты и времени ( datetime и smalldatetime ) Я не рекомендую yyyy-MM-dd , так как это неоднозначно; это не относится к более новым типам данных данных и времени.

2. В каком сценарии мне понадобится присоединиться? Мне просто любопытно. Наверное, я слишком много об этом думал

3. @Koosh . . . Судя по вашему вопросу, вы переосмыслили его. Все необходимые вам данные находятся в одной строке.