查询可在不创建过程的情况下从另一个表更新表中的列



我有两个表。表1称为文件名,表2称为授权。文件名表有一个名为folder_name的列,folder_name值的例子是";E:/x/y/z/10689/t/y/c";。10689是授权id;grant_ id";在grants表的文件名表中。我希望在不创建游标和过程的情况下完成此操作。一个视图甚至可以;像";命令并解析folder_name中的grant-id,并根据grants表进行检查。这是一对多的关系。。。一个grant(基本上是10689文件夹(可以有多个文件,如果它包含10689,我需要用相同的grant id映射所有folder_name值。有没有一种方法可以做到这一点,而不需要编写光标和过程?

我是SQL Server的新手,请耐心等待。基本上,我可以写一个SQL查询,而不是写下面这样的过程吗。

DECLARE @grant_id AS INT;
DECLARE @grant_number AS varchar(100);
declare cursor_grants cursor for
select grant_id, grant_number
from grant_info
where grant_id = 10689;

open cursor_grants;
fetch next from cursor_grants into @grant_id, @grant_number;
while @@fetch_status = 0
begin
update filenames
set log_num = @grant_number, grant_id = @grant_id
where location like '%/'+cast(@grant_id as varchar)+'/%';
FETCH NEXT FROM cursor_grants INTO @grant_id, @grant_number;
end;
CLOSE cursor_grants;
DEALLOCATE cursor_grants;

您可以通过加入使用更新

update f set f.grant_id=g.grant_id
from filenames f inner join grants g on f.grant_id=g.grant_id
where   folder_name like '%/10689/%'

在表联接中使用Like运算符

这个问题的基本前提是文件夹名称表中的外键经常需要更新,并且授权和文件夹名称表之间存在1对多的关系。

因此,在这种情况下,我会使用类似的运算符将文件夹名称表与授予表连接起来,然后更广泛地(根据您的要求(,否则我们将不会更新符合此匹配标准的文件夹名称记录。

UPDATE fname
SET
fname.grant_id = grnt.grant_id
FROM
filenames fname
JOIN grants grnt ON fname.folder_name LIKE '%/' + CAST(grnt.grant_id AS VARCHAR) + '/%'
WHERE
1 = 1
-----example scenario-----
AND grnt.grant_id = 10689;

最新更新