根据条件匹配并设置child的ID

Match and set child's ID based on condition

我有一个主要的增量 ID 列,必须找到并设置它的所有子项(在 ParentID 列中)基于来自其他两列的值(Condition1Condition2) Started ParentID 始终具有 Condition2 = 1(Condition1 列中的值相同)

初始table

+---------------------------------------------
|  ID |  ParentID  | Condition1 | Condition2 |
+---------------------------------------------
|  1  |       null |      1000  |          1 |
|  2  |       null |      1000  |       null |
|  3  |       null |      1000  |       null |
|  4  |       null |      2000  |          1 |
|  5  |       null |      2000  |       null |
|  6  |       null |      2000  |       null |
|  7  |       null |      3000  |          1 |
|  8  |       null |      3000  |       null | 
|  9  |       null |      3000  |       null |
+---------------------------------------------

期望输出

+---------------------------------------------
|  ID |  ParentID  | Condition1 | Condition2 |
+---------------------------------------------
|  1  |          1 |      1000  |          1 |
|  2  |          1 |      1000  |       null |
|  3  |          1 |      1000  |       null |
|  4  |          4 |      2000  |          1 |
|  5  |          4 |      2000  |       null |
|  6  |          4 |      2000  |       null |
|  7  |          7 |      3000  |          1 |
|  8  |          7 |      3000  |       null | 
|  9  |          7 |      3000  |       null |
+---------------------------------------------

当前代码returns每个新ID只有一行

update u 
set u.ParentID = u.ID
from [db].[dbo].[tbl] u
  inner join [db].[dbo].[tbl]  on 
        u.Condition2 = 1 and u.Condition1 = u.Condition1

我认为一种直观的方法是

UPDATE [db].[dbo].[tbl] u
SET u.ParentID = (SELECT id FROM [db].[dbo].[tbl] u2 WHERE u2.condition1 = u.condition1 and u2.condition2 = 1)

我并不是说这比您尝试做的更好,只是我认为如果您遇到问题,它非常直观且易于理解。

我认为您正在寻找的解决方案是:

update u 
set u.ParentID = u2.ID
from [db].[dbo].[tbl] u
  inner join [db].[dbo].[tbl] u2  on 
        u2.Condition2 = 1 and u.Condition1 = u2.Condition1

这里的重要区别是我给 join-to-self 中的两个 table 都起了一个名字(u 和 u2)。你不想设置 u.ParentID = u.ID (如你的问题),你想设置 u.ParentID = u2.ID (注意2)。同样,您不想在 u.condition1 = u.condition1u.condition2 = 1 上加入 table(因为在本例中始终如此)或 u.condition2 = 1(因为您将该条件应用于 table 你正在更新,而不是你加入的 table)。即使它是 join-to-self,您也需要清楚您引用的是哪个 table。 u 在您的查询中指的是正在更新的 table,而不是连接 right-side 上的 table。