【发布时间】:2020-10-12 03:31:11
【问题描述】:
我想将 B 插入 A 并得到 C :
A : B :
+----+-----------+-------+------+ +-------+--------------+------+
| id | id_parent | value | name | | value | value_parent | name |
+----+-----------+-------+------+ +-------+--------------+------+
| 1 | NULL | 11 | a | | 21 | 22 | x |
| 2 | 1 | 12 | b | | 22 | 12 | y |
| 3 | 1 | 13 | c | | 23 | 21 | z |
+----+-----------+-------+------+ +-------+--------------+------+
C :
+----+-----------+-------+------+
| id | id_parent | value | name |
+----+-----------+-------+------+
| 1 | NULL | 11 | a |
| 2 | 1 | 12 | b |
| 3 | 1 | 13 | c |
| 4 | 2 | 22 | y |
| 5 | 4 | 21 | x |
| 6 | 5 | 23 | z |
+----+-----------+-------+------|
[编辑:唯一的限制是在两个值列中都不能重复,并且“value_parent”必须是存在于 A 或 B 的值列中的值]
我现在看到的解决方案似乎效率很低。
我可以对 B 中的行进行分组,以便第 1 组包含其父值在 A 中的行,第 2 组包含其父值在第 1 组中的行,依此类推。然后我可以依次插入组 n 并使用从插入中获得的 id 更新组 n+1,直到我插入所有内容。
+-------+-----------+------+
| value | id_parent | name |
+-------+-----------+------+
STEP 1
Group 1
| 22 | 2 | y | // find the associated id_parent and insert this group
Group 2
| 21 | NULL | x |
Group 3
| 23 | NULL | z |
STEP 2
Group 1
| 22 | 2 | y |
Group 2
| 21 | 4 | x | // update this group and insert it
Group 3
| 23 | NULL | z |
STEP 3
Group 1
| 22 | 2 | y |
Group 2
| 21 | 4 | x |
Group 3
| 23 | 5 | z | // update this group and insert it
+-------+-----------+------+
我想知道是否存在更直接的东西,因为我在互联网上找不到任何东西。如果有用,我正在使用 T-SQL。
【问题讨论】:
标签: sql tsql sql-insert self-reference