将一个数据表的行与另一个数据表的列进行比较

本文关键字:数据表 另一个 比较 一个 | 更新日期: 2023-09-27 18:19:38

first table:dtHeader
 Header
---------
Address
ZipCode
city
state

Second table:-dtReport
RowNumber-----Address------Zipcode---Region------city
   1200       JC           00000     NYC         Bronx
   13000       RC            12345    NC          Boston

我想删除 dtreport 中列名不在 dtHeader 中的所有列因此,结果 dtReport 将仅具有地址--邮政编码--城市列。我不想创建另一个数据表,因为它有大量行,即 70000我怎样才能做到这一点?

将一个数据表的行与另一个数据表的列进行比较

您可以使用

Enumerable.Except查找必须从dtReport中删除的所有列名

var notAllowedColNames = dtReport.Columns.Cast<DataColumn>()
    .Select(c=> c.ColumnName.ToUpperInvariant())
    .Except(dtHeader.AsEnumerable().Select(r => r.Field<String>("Header").ToUpperInvariant()))
    .ToList();
foreach(var colName in notAllowedColNames) 
     dtReport.Columns.Remove(colName);

我使用了ToUpperInvariant,因为ZipCode两个表中都有不同的情况。

未测试,而是 dtReport 列集合上的简单循环,检查 dtHeader 列集合是否包含等名列。如果没有,请从 dtReport 中删除该列。

    SqlCommand cmdHeader = new SqlCommand("SELECT * FROM Header", conn);
    SqlCommand cmdReport = new SqlCommand("SELECT * FROM Report", conn);
    DataTable dtHeader = new DataTable();
    DataTable dtReport = new DataTable();
    SqlDataAdapter da1 = new SqlDataAdapter(cmdHeader);
    da1.Fill(dtHeader)
    SqlDataAdapter da2 = new SqlDataAdapter(cmdReport);
    da2.Fill(dtReport);
    for(int x = dtReport.Columns.Count - 1; x >= 0; x--)
    {
        DataColumn dc = dtReport.Columns[x];
        if(!dtHeader.Columns.Contains(dc.ColumnName))
             dtReport.Columns.Remove(dc.ColumnName);
    }

诀窍是使用for..从最后一列到第一列的循环。通过这种方式,您可以在迭代集合时删除列(因为每个都无法执行此操作(

全 SQL 答案如下所示

    INSERT INTO #TEMP_TABLE
  SELECT c.name
FROM sys.tables AS t
INNER JOIN sys.columns AS c ON t.OBJECT_ID = c.OBJECT_ID
WHERE t.name = 'dtReport' AND c.name NOT IN (SELECT Header FROM dtHeader)
  WHILE ((SELECT COUNT(*) FROM #TEMP_TABLE) > 0)
    BEGIN
        DECLARE @COLUMN_NAME VARCHAR(50) = (SELECT TOP 1 Header FROM #TEMP_TABLE)
        ALTER TABLE PATRON DROP COLUMN @COLUMN_NAME
        DELETE FROM #TEMP_TABLE WHERE Header = @COLUMN_NAME
    END