【问题标题】:Concat rows from the same field, according to coincidence with other table in SQL?根据与 SQL 中其他表的重合,从同一字段连接行?
【发布时间】:2020-08-17 07:55:36
【问题描述】:

我在尝试从表 t1 上传字段 caracter 时遇到问题。如果它出现在t2frase 中,我想将caracter 的值与之前的值连接起来。例如,如果在caracter 中找到 x、y 或 z,并且这些值出现在 t2 中的 frase 中,我想将 x、y 和 z 与 caracter 中的前一个值连接起来。

t1

t2

这应该是结果

t1

我尝试使用游标,但它不起作用,因为我在 set 处引用错误,之前我尝试使用 while 循环但结果相同。

 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

【问题讨论】:

  • 数据图像确实不能帮助我们帮助您。请花时间提供表格格式的text,或者(甚至更好)DDL 和 DML 语句。然后我们可以使用这些数据并帮助您获得所需的结果。

标签: sql-server indexing string-concatenation cursors


【解决方案1】:

希望这可以达到目的,您必须利用 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

【讨论】:

  • 非常感谢您抽出宝贵时间,效果很好。我在 concat 函数中添加了一个空格,使其看起来像我想要的这一行 CONCAT(CARACTER_ANA.CARACTER,' ',lg)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-30
  • 2022-01-11
  • 1970-01-01
  • 2020-10-14
  • 1970-01-01
  • 2011-09-28
  • 2013-01-04
相关资源
最近更新 更多