2016-02-09 2 views
0

Нужно SQL-запрос для выполнения UPDATE и SELECT в одном выражении.SQL Query Объединение обновлений и выбор в одном заявлении

У меня есть две таблицы. Сначала мне нужно отфильтровать вторую таблицу После фильтрации второй таблицы мне нужно обновить первую таблицу из итоговой отфильтрованной второй таблицы.

оператор обновления следует заявление Выберите SCENARIO

+2

В каких «РСУБД» вы используете –

+0

Возможный дубликат [Обновить и выбрать в одном запросе] (http://stackoverflow.com/questions/4057244/update-and-select-in-one-query) –

+0

SQL @ VR46 .. Этот сценарий недоступен – user5705451

ответ

2

Вы не сказали нам, что ваша база данных, но это будет работать для 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.

Надеюсь, что это поможет.

+0

(FN! = Aaa) условие не упоминается. Не могли бы вы также объяснить запрос? – user5705451

+0

Да, Саймон пропустил условие WHERE s.FN! = 'Aaa''. Сначала запрос выполняет соединение, а затем обновляет таблицу, указанную в первой строке (вы можете просто использовать псевдоним: 'update f'). Он устанавливает все поля FirstName в значение, возвращаемое 'case', и его логика довольно проста: он возвращает' s.FN' или 'f.FirstName' в зависимости от указанного вами условия. – Andrew

+0

Отредактировано, чтобы объяснить и добавить отсутствующий где (d'oh!) –

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