Concat строк из одного поля, в соответствии с совпадением с другой таблицей в SQL? - PullRequest
0 голосов
/ 02 мая 2020

У меня проблема при попытке загрузить поле caracter из таблицы t1. Я хочу объединить значение из caracter, если оно появляется в frase из t2, с предыдущим значением. Например, если найденные x, y или z в caracter и эти значения появляются в frase из t2, я бы хотел объединить x, y и z с предыдущим значением в caracter.

t1

enter image description here

t2

enter image description here

Это должен быть результат

t1

enter image description here

Я пытался с помощью курсора, но он не работает, потому что у меня ошибка ссылки на set, ранее я пытался с помощью пока l oop, но имел тот же результат.

 DECLARE @frase VARCHAR (100)
 DECLARE MICURSOR CURSOR FOR SELECT caracter FROM t1 
 OPEN MICURSOR
 FETCH NEXT FROM MICURSOR 

 WHILE @@fetch_status = 0

 BEGIN

 SELECT t1.caracter FROM t1 INNER JOIN t2 
 ON t2.frase LIKE CONCAT('%', t1.caracter,'%')
 UPDATE t1 SET caracter=  'caracter' + '(@frase-1)'

  FETCH NEXT FROM MICURSOR INTO @frase
END
CLOSE MICURSOR
DEALLOCATE MICURSOR

1 Ответ

0 голосов
/ 03 мая 2020

Надеюсь, что это служит цели. Вы должны использовать агрегатную функцию lead (), чтобы получить следующую строку. Вы можете найти полное решение в ссылке dbfiddle с таблицей и записями, заполненными, чтобы продемонстрировать, как работает запрос. Решение для SQLSEVER 2019. https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=71510d727bb04478383887e2e8ab3a52

update t1 set t1.caracter = concat(t1.caracter,lg)
from
 (select id_val,ver,caracter,lead(caracter) over (order by id_val) lg from t1) tab,t1
 where lg in (select frase from t2)
 and tab.caracter = t1.caracter;

 delete from t1 where caracter in (select frase from t2);

select * from t1;

id_val  ver caracter
1   abc abc
1   abc 3
1   abc x
1   abc 2
1   abc y
2   def def
2   def 5
2   def y
2   def 9
2   def z

Вывод после применения сценария

id_val  ver caracter
1   abc abc
1   abc 3x
1   abc 2y
2   def def
2   def 5y
2   def 9z
...