Вы не сказали нам, что ваша база данных, но это будет работать для SQL Server.
update FirstTable
set f.FirstName = case when f.FirstName = s.MiddleName then s.FN else f.FirstName end,
f.LastName = case when f.LastName = s.MiddleName then s.FN else f.LastName end
from FirstTable f
inner join SecondTable s on f.FirstName = s.MiddleName or f.LastName = s.MiddleName
where s.FN <> 'aaa' -- Missed first time
Я не думаю, что он будет работать точно так же, как и для других РСУБД.
EDIT: Добавлена Где в SQL, и объяснение, которое следует:
Запрос имеет вид:
update table1
set col1 = x.colN
from table1 t
inner join table2 x on some condition
Это в двух частях на обновление + набор линии, и из запроса, который является полным предложением select без фактического списка столбцов выбора. Подумайте о втором, как префикс 'select *'.
Вторая часть (кишки выражения выбора) должна использовать ту же таблицу, что и часть обновления - FirstTable в вашей проблеме и таблице1 в скелете выше. Поскольку он выбирает строки из той же таблицы, что и обновление, он знает, какие строки вы хотите обновить, и делает столбцы в выбранной части доступными для части обновления. В скелете я могу установить col1 из table1 в colN из таблицы2.
Ваша проблема немного сложнее, поскольку я не обязательно хочу изменять имя FirstName или LastName. Чтобы принять FirstName, я хочу изменить FirstName на FN, когда FirstName = MiddleName. Для этого я использую случай как часть набора:
set f.FirstName = case when f.FirstName = s.MiddleName then s.FN else f.FirstName end
Это говорит, когда FirstName = MiddleName затем установите ПгвЬЫате о FN, иначе установить его FirstName (другими словами, не изменяйте его).
Повторите для LastName.
Надеюсь, что это поможет.
В каких «РСУБД» вы используете –
Возможный дубликат [Обновить и выбрать в одном запросе] (http://stackoverflow.com/questions/4057244/update-and-select-in-one-query) –
SQL @ VR46 .. Этот сценарий недоступен – user5705451