У меня есть таблица, и я хочу обновить одно из своих полей varchar на основе значений в другой таблице.Обновить поле таблицы, заменив подстроки на основе значений из другой таблицы
У меня есть следующая таблица:
ID Constraint_Value
----------------------------
1 (OldVal_1) (OldVal_2)
2 (OldVal_2) (OldVal_1)
... и я хочу использовать данные из следующей таблицы, чтобы сделать обновление:
oldValue newValue
----------------------------
OldVal_1 NewVal_1
OldVal_2 NewVal_2
После обновления, я стремлюсь по следующим вопросам:
ID Constraint_Value
----------------------------
1 (NewVal_1) (NewVal_2)
2 (NewVal_2) (NewVal_1)
Следующий SQL иллюстрирует мою проблему (которую вы можете запустить в SQL Management Stud ИО без какой-либо настройки):
IF OBJECT_ID('tempdb..#tmpConstraint') IS NOT NULL DROP TABLE #tmpConstraint
GO
CREATE TABLE tempdb..#tmpConstraint (constraint_id INT PRIMARY KEY, constraint_value varchar(256))
GO
IF OBJECT_ID('tempdb..#tmpUpdates') IS NOT NULL DROP TABLE #tmpUpdates
GO
CREATE TABLE tempdb..#tmpUpdates (oldValue varchar(256), newValue varchar(256))
GO
insert into #tmpConstraint
values (1, '(OldVal_1) (OldVal_2)')
insert into #tmpConstraint
values (2, '(OldVal_2) (OldVal_1)')
insert into #tmpUpdates
values ('OldVal_1', 'NewVal_1')
insert into #tmpUpdates
values ('OldVal_2', 'NewVal_2')
select * from #tmpConstraint
update c
set constraint_value = REPLACE(constraint_value, u.oldValue, u.newValue)
from #tmpConstraint c
cross join #tmpUpdates u
select * from #tmpConstraint
Это дает результаты:
(Before)
1 (OldVal_1) (OldVal_2)
2 (OldVal_2) (OldVal_1)
(After)
1 (NewVal_1) (OldVal_2)
2 (OldVal_2) (NewVal_1)
Как вы можете видеть только OldVal_1
был обновлен. OldVal_2
остался прежним.
Как обновить поле со всеми данными в таблице поиска?
Я понимаю, что этот вопрос похож на другой вопрос, я спросил (http://stackoverflow.com/questions/10836092/how-to-update-a-table- based-on-a-xml-parameter), но я удалил XML из уравнения по этому вопросу, поэтому, надеюсь, это может привести к некоторым различным подходам. Конечно, я уточню этот вопрос с любыми полезными ответами из другого вопроса. –
.. Многозначные столбцы, один из худших анти-шаблонов SQL, известных (для этого и по другим причинам). Пожалуйста, шпиндель, сверните и калечите оригинального дизайнера. Похоже, что некоторые версии SQL Server поддерживают CTE для операторов UPDATE, поддерживают ли они _recursive_ в этом случае? Если это так, вы, вероятно, можете написать CTE, чтобы собрать новое значение 'constraint_value' .... В противном случае, единственное, что я могу придумать, - это запустить оператор несколько раз, пока строка имеет экземпляр старого значения. –
@ X-Zero - в качестве оригинального дизайнера я начну шпинделировать, сворачивать и калечить себя, как только закончу писать этот комментарий! Однако, чтобы дать вам некоторый контекст, фактическое значение в поле constraint_value является формулой (например, «(((100)/OldVal_1) * OldVal_2)»), что я должен обновить некоторые элементы (по причинам, слишком утомительным для объяснить). Как вы можете себе представить, формула не очень хорошо хранится в реляционной базе данных, особенно если эта формула может превратиться в более условный алгоритм в будущем. Его все еще анти-шаблон! –