親子テーブルのデータを複雑なデータ構造に効率的に挿入するストアド プロシージャ
質問:
複雑なデータベース構造において、ストアド プロシージャを使用して、正しいデータ マッピングを確保し、パフォーマンスを最適化しながら、親子テーブルにデータを効率的に挿入するにはどうすればよいでしょうか?
解決策:
親子テーブルにデータを効率的に挿入するには、次の手順に従います:
一時 ID 列の作成: ユーザー定義テーブル (UDT) に EmployeeId
列を追加して、各従業員の一時 ID を保存します。
UDT に一時 ID を設定します: 一時 ID を含むデータを UDT に挿入します。
EmployeeID マッピング テーブルの作成: テーブル変数 (@EmployeeidMap
) を宣言して、従業員テーブルから挿入された値を UDT の一時的な従業員 ID にマッピングします。
MERGE ステートメントを使用して従業員テーブルに挿入します。 MERGE
ステートメントを使用して @MainEmployee
テーブルにデータを挿入し、ソース データの従業員 ID と挿入された従業員 ID をマッピングに出力します。テーブル。
ParentEmployeeDepartment テーブルに挿入: UDT をマッピング テーブルと結合し、実際の従業員 ID を取得して、データを @ParentEmployeeDepartment
テーブルに挿入します。
は ParentEmployeeDepartmentID にマップされます: @ParentEmployeeDepartment
のデータを使用して、ParentEmployeeDepartmentID
の実際の値をストアド プロシージャによって送信されたデータにマップします。
サブテーブルに挿入: Parent
テーブルの EmployeeID
と DepartmentType
を使用して、データをどのサブテーブルに挿入するかを決定します。
コード:
<code class="language-sql">-- 创建EmployeeID映射表 DECLARE @EmployeeidMap TABLE (temp_id int, id int); -- 使用MERGE语句插入员工表 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; -- 插入ParentEmployeeDepartment表 INSERT INTO @ParentEmployeeDepartment (EmployeeID, DepartmentType) SELECT Id, DepartmentType FROM @tEmployeeData INNER JOIN @EmployeeidMap ON EmployeeID = temp_id; -- 映射到ParentEmployeeDepartmentID SELECT FirstName, LastName, SentData.DepartmentType AS [Dept. Type], DepartmentBuilding AS Building, DepartmentEmployeeLevel AS [Emp. Level], DepartmentTypeAMetadata AS [A Meta], DepartmentTypeBMetadata AS [B Meta], SentData.EmployeeId AS TempId, EmpMap.id AS [Emp. Id], DeptMap.ParentEmployeeDepartmentID AS [Dept. Id] FROM @tEmployeeData SentData INNER JOIN @EmployeeidMap EmpMap ON SentData.EmployeeId = temp_id INNER JOIN @ParentEmployeeDepartment DeptMap ON EmpMap.id = DeptMap.EmployeeID;</code>
出力:
FirstName | LastName | Dept. Type | Building | Emp. Level | A Meta | B Meta | TempId | Emp. Id | Dept. Id |
---|---|---|---|---|---|---|---|---|---|
Dave_FN | Dave_LN | B | OpenC | XII | NULL | Lab | 8 | 1 | 1 |
Joe_FN | Joe_LN | A | 101 | IV | Tech/IT | NULL | 7 | 2 | 2 |
Mike_FN | Mike_LN | B | OpenH | XII | NULL | Med | 6 | 3 | 3 |
Tom_FN | Tom_LN | A | 101 | IV | Tech/IT | NULL | 5 | 4 | 4 |
注:
このソリューションはマッピング テーブルを使用して、テーブル間の異なるデータを効率的に照合します。行ごとの操作を回避し、パフォーマンスを最適化するため、大規模なデータ セットに適しています。
以上がストアド プロシージャを使用して複雑なデータ構造の親テーブルと子テーブルにデータを効率的に挿入し、適切なデータ マッピングと最適なパフォーマンスを確保するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。