>백엔드 개발 >C++ >SQL Server에서 다양한 열 구조를 사용하여 여러 DataTable을 효율적으로 병합하는 방법은 무엇입니까?

SQL Server에서 다양한 열 구조를 사용하여 여러 DataTable을 효율적으로 병합하는 방법은 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-12-27 19:10:11430검색

How to Efficiently Merge Multiple DataTables with Varying Column Structures in SQL Server?

여러 DataTable을 단일 DataTable로 결합

SQL Server에서 데이터 작업을 할 때 여러 테이블의 데이터를 하나의 DataTable로 결합해야 하는 경우가 있습니다. 단일 통합 데이터 세트. 이는 다른 테이블의 행을 대상 테이블에 추가할 수 있는 병합 작업을 사용하여 수행할 수 있습니다. 그러나 테이블의 열 구조가 다른 경우 병합된 결과 테이블에 데이터가 채워지거나 잘못 정렬될 수 있습니다.

기존 솔루션 및 제한 사항

제공되는 솔루션은 이를 해결하려고 시도합니다. 다양한 열 구조를 가진 여러 알 수 없는 테이블의 DataTable을 결합하기 위해 병합 루프를 사용하여 문제를 해결합니다. 이 방법은 효과가 있지만 지루할 수 있으며 데이터 정렬이 잘못될 수 있습니다.

LINQ를 사용한 대체 접근 방식

이러한 제한을 극복하려면 LINQ(Language 통합 쿼리)는 사용 가능:

public static DataTable MergeAll(this IList<DataTable> tables, String primaryKeyColumn)
{
    if (!tables.Any())
        throw new ArgumentException("Tables must not be empty", "tables");
    if(primaryKeyColumn != null)
        foreach(DataTable t in tables)
            if(!t.Columns.Contains(primaryKeyColumn))
                throw new ArgumentException("All tables must have the specified primarykey column " + primaryKeyColumn, "primaryKeyColumn");

    if(tables.Count == 1)
        return tables[0];

    DataTable table = new DataTable("TblUnion");
    table.BeginLoadData(); // Turns off notifications, index maintenance, and constraints while loading data
    foreach (DataTable t in tables)
    {
        table.Merge(t); // same as table.Merge(t, false, MissingSchemaAction.Add);
    }
    table.EndLoadData();

    if (primaryKeyColumn != null)
    {
        // since we might have no real primary keys defined, the rows now might have repeating fields
        // so now we're going to "join" these rows ...
        var pkGroups = table.AsEnumerable()
            .GroupBy(r => r[primaryKeyColumn]);
        var dupGroups = pkGroups.Where(g => g.Count() > 1);
        foreach (var grpDup in dupGroups)
        { 
            // use first row and modify it
            DataRow firstRow = grpDup.First();
            foreach (DataColumn c in table.Columns)
            {
                if (firstRow.IsNull(c))
                {
                    DataRow firstNotNullRow = grpDup.Skip(1).FirstOrDefault(r => !r.IsNull(c));
                    if (firstNotNullRow != null)
                        firstRow[c] = firstNotNullRow[c];
                }
            }
            // remove all but first row
            var rowsToRemove = grpDup.Skip(1);
            foreach(DataRow rowToRemove in rowsToRemove)
                table.Rows.Remove(rowToRemove);
        }
    }

    return table;
}

사용법

MergeAll 메서드를 사용하려면 DataTable 목록을 전달하고 선택적으로 공통 기본 키 열 이름을 지정합니다.

var tables = new[] { tblA, tblB, tblC };
DataTable TblUnion = tables.MergeAll("c1");

LINQ의 장점 접근 방식

  • 수동 루프의 필요성을 제거하여 병합 프로세스를 단순화합니다.
  • 열이 다를 때 행을 병합하기 위해 기본 키를 선택적으로 지정할 수 있습니다.
  • 기본 키 반복에 대한 데이터 값을 자동으로 결합하고 조정합니다. 행.

참고: 이 솔루션을 사용하려면 모든 테이블에 지정된 경우 기본 키에 대한 고유한 열 이름이 있어야 합니다.

위 내용은 SQL Server에서 다양한 열 구조를 사용하여 여러 DataTable을 효율적으로 병합하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.