在父子表中插入数据
本示例的目标是从传入的 UDT (@tEmployeeData) 中插入数据到多个表中,确保父子记录之间的正确映射。
解决映射问题
为了建立必要的映射,我们在 UDT 中添加一个临时 employeeId 列,并用连续值填充。此外,我们创建一个表变量 (@EmployeeidMap) 来映射 UDT 中的临时 employee ID 与目标表中生成的实际 employee ID。
填充主表
我们利用 MERGE 来填充 @MainEmployee 表,使用插入数据和源数据的值。这允许我们捕获生成的 EmployeeID 值并同时填充映射表。
<code class="language-sql">MERGE INTO @MainEmployee USING @tEmployeeData AS sourceData ON 1 = 0 WHEN NOT MATCHED THEN INSERT (FirstName, LastName) VALUES (sourceData.FirstName, sourceData.LastName) OUTPUT sourceData.EmployeeId, inserted.EmployeeID INTO @EmployeeidMap (temp_id, id);</code>
映射和插入到父子表
然后,我们将 @tEmployeeData 与 @EmployeeidMap 连接以获取实际的 employee ID,我们用它来填充 @ParentEmployeeDepartment 表。类似地,我们将 @ParentEmployeeDepartment 与 @tEmployeeData 连接以将父 ID 映射到子数据,并将数据插入到 @ChildEmployeeDepartmentTypeA 和 @ChildEmployeeDepartmentTypeB 中。
测试插入
为了验证映射是否成功,我们执行一个查询,将 UDT 数据与映射和目标表连接。
<code class="language-sql">SELECT FirstName, LastName, SentData.DepartmentType As [部门类型], DepartmentBuilding As 建筑物, DepartmentEmployeeLevel As [员工级别], DepartmentTypeAMetadata As [A 元数据], DepartmentTypeBMetadata As [B 元数据], SentData.EmployeeId As 临时ID, EmpMap.id As [员工ID], DeptMap.ParentEmployeeDepartmentID As [部门ID] FROM @tEmployeeData SentData INNER JOIN @EmployeeidMap EmpMap ON SentData.EmployeeId = temp_id INNER JOIN @ParentEmployeeDepartment DeptMap ON EmpMap.id = DeptMap.EmployeeID</code>
这种方法确保子数据与其各自的父记录正确映射,同时通过避免不必要的逐行操作来优化性能。
以上是如何高效地将数据插入父子表并正确映射?的详细内容。更多信息请关注PHP中文网其他相关文章!