我对SQL很新。我正在尝试以下方法。我有以下table1与列组和描述。
表1示例
我想检查单元格值是否部分相同。就像在这种情况下Group101和Group101D1。现在我想从D1中获取值的描述并将其放在没有D1的那个的描述列中。并且对于Group值部分相同的所有单元格执行此操作。
SELECT [Group]
,[Description]
FROM [Table1]
update [Table1]
set Description = (Select [Description] from [Table1] where [Group] like '%Group101D1%')
where Address like '%Group1%'
这是我走了多远。我可以让它适用于一个,但必须将其拆分并使其适用于所有这些。
试试这个查询:
WITH cte AS (
SELECT t1.Description AS desc_dest, t2.Description AS desc_src
FROM yourTable t1
INNER JOIN yourTable t2
ON t2.[Group] LIKE t1.[Group] + '[A-Z]%' AND LEN(t1.[Group]) <= 9
)
UPDATE cte
SET desc_dest = desc_src;
如果您只是希望在最后两个字符中只有不同的所有描述之间保持一致,那么应该遵循以下方法:
WITH CTE AS
(
SELECT
a.Description
, b.Description AS Descriptionb
FROM
TABLE1 a
JOIN [Table1] b ON LEFT(a.[Group], LEN(a.[Group]) - 2) = b.[Group]
)
update CTE
set Description = Descriptionb
自连接确定我们查找所有描述,其中来自集合a(Group101D1
)的最后2个字符被移除,因此我们最终得到Group101
。然后我们在集合b中寻找匹配。如果我们找到它,我们设置b的值以匹配a中的值。
这意味着Group101D1
的描述将设置为Group101
,Group101XX也是如此。它还应该允许处理Group1010404D1
来改变Group1010404
。
编辑:切换UPDATE。我读错了,它会更新错误的值。
编辑2:正如蒂姆所说,我的加入错了。不过,上述情况应该奏效。
我的解决方案如下:
SELECT [Table1].[Description]
, [Table2].[Description]
,[Table1].[Group]
,[Table2].[Group]
--update [Table1] set [Table1].[Description] = [Table2].[Description]
FROM [BVCIOList_DOW].[dbo].[Table] Table1
INNER JOIN [BVCIOList_DOW].[dbo].[Table] Table2
ON [Table2].[Group] = [Table1].[Group] + 'D1'