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

时间:2020-07-20 07:44:31

标签: sql-server sql-update

我的表格中有以下几列: FolderPathUserGroupPermissionAccessControllTypeFolderIdIsInherited

Database table

如果IsInherited在表中包含另一个FolderPath并且FolderPath是相同的并且UserGroup是一样。

我如何尽快做到这一点?

谢谢。

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

Permission

但是当我检查结果时,它们不是我所期望的。当用户对较低级别的文件夹具有其他权限时,该字段也设置为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 。那是问题所在。

1 个答案:

答案 0 :(得分:1)

您可以使用:

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

UsergroupPermission相等且FolderPath以相同的部分开头时,这将联接同一张表。

由于它是inner join,因此只会更新符合此条件的行。

如果您不想切换所有行的状态,则可以使用:

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
相关问题