Sql server 如何基于同一表中的其他行更新列的值

Sql server 如何基于同一表中的其他行更新列的值,sql-server,sql-update,Sql Server,Sql Update,我的表中有以下列: 文件夹路径,用户组,权限,访问控制类型,文件夹ID,已写入 如果FolderPath在表中包含另一个FolderPath,并且UserGroup相同且权限相同,我想更新IsInherited列 我如何以最快的方式做到这一点 提前谢谢 编辑: 我现在有下面的SQL语句。它基于一个答案: UPDATE t1 SET t1.IsInherited = 'True' FROM dbo.Folder t1 INNER JOIN dbo.Folder t2 on t1.Use

我的表中有以下列:
文件夹路径
用户组
权限
访问控制类型
文件夹ID
已写入

如果
FolderPath
在表中包含另一个
FolderPath
,并且
UserGroup
相同且
权限相同,我想更新
IsInherited

我如何以最快的方式做到这一点

提前谢谢

编辑: 我现在有下面的SQL语句。它基于一个答案:

UPDATE t1
    SET t1.IsInherited = 'True'
FROM dbo.Folder t1 
INNER JOIN dbo.Folder t2 on t1.UserGroup = t2.UserGroup
    AND t1.Permission = t2.Permission
    AND t1.FolderPath LIKE  t2.FolderPath+'%'
WHERE t1.FolderId <> t2.FolderId
更新t1
SET t1.isInhered='True'
从dbo.t1文件夹
t1.UserGroup=t2.UserGroup上的内部联接dbo.Folder t2
t1.权限=t2.权限
和t1.FolderPath类似于t2.FolderPath+'%
其中t1.FolderId t2.FolderId
但是当我检查结果时,结果并不是我所期望的。当用户对较低级别的文件夹具有其他权限时,该字段也被设置为
True
。这就是问题所在。

您可以使用:

UPDATE t1
    SET t1.IsInherited = 'Yes' -- Or use a bit field with value : 1
FROM Table t1
INNER JOIN Table t2 on t1.UserGroup = t2.UserGroup
    AND t1.Permission = t2.Permission
    AND t1.FolderPath LIKE  t2.FolderPath+'%' 
    AND t1.FolderId <> t2.FolderId
UPDATE t1
    SET t1.IsInherited = IIF(t2.FolderId IS NULL, 'No', 'Yes')
FROM Table t1
LEFT JOIN Table t2 on t1.UserGroup = t2.UserGroup
    AND t1.Permission = t2.Permission
    AND t1.FolderPath LIKE  t2.FolderPath+'%' 
    AND t1.FolderId <> t2.FolderId

与我们共享您当前拥有的代码。这将帮助人们提出与您的实现接近的解决方案(从而使您以后更容易将它们集成到代码中)。检查如何提出一个好问题:@VictorZuanazzi我还没有一些代码,因为我不知道如何开始。我不会尝试解决您的问题,因为您没有显示任何代码。但也许自连接可以帮助您:
IsInherited
是一个字符串字段,因此它可能是“是”或“否”(位类型确实更符合逻辑)。@PrebenHuybrechts我尝试了该解决方案,它以某种方式将所有数据更新为“是”,而不仅仅是它应该更新的数据。我认为是这样的,因为您将tabe本身连接起来,然后每个条目都至少有一个匹配的条目。与另一个表中的完全相同。@Mikey请包含一个带有样本数据的SQL FIDLE,并包含样本数据的预期输出。