根据条件匹配并设置child的ID
Match and set child's ID based on condition
我有一个主要的增量 ID 列,必须找到并设置它的所有子项(在 ParentID 列中)基于来自其他两列的值(Condition1 和 Condition2)
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.condition1
或 u.condition2 = 1
上加入 table(因为在本例中始终如此)或 u.condition2 = 1
(因为您将该条件应用于 table 你正在更新,而不是你加入的 table)。即使它是 join-to-self,您也需要清楚您引用的是哪个 table。 u
在您的查询中指的是正在更新的 table,而不是连接 right-side 上的 table。
我有一个主要的增量 ID 列,必须找到并设置它的所有子项(在 ParentID 列中)基于来自其他两列的值(Condition1 和 Condition2) 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.condition1
或 u.condition2 = 1
上加入 table(因为在本例中始终如此)或 u.condition2 = 1
(因为您将该条件应用于 table 你正在更新,而不是你加入的 table)。即使它是 join-to-self,您也需要清楚您引用的是哪个 table。 u
在您的查询中指的是正在更新的 table,而不是连接 right-side 上的 table。