#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 . . . Судя по вашему вопросу, вы переосмыслили его. Все необходимые вам данные находятся в одной строке.