0

如何在 C# (LINQ-to-SQL) 或 SQL 中创建一个通用函数,该函数采用两个具有匹配结构的表并计算 TableA 中有多少行在 TableB 中。

TableA Structure
Value1, Value2

TableA Data
1,1

TableB Structure
Value1, Value2

TableB Data
1,1,
1,2

要获取 TableA 和 TableB 之间的匹配行数:

SELECT COUNT(*) FROM TableA 
INNER JOIN TableB ON
TableA.Value1 = TableB.Value1 AND
TableA.Value2 = TableB.Value2

本例中的结果

1

所以上面的查询效果很好,但我不想为我想要执行此操作的每一对表编写一个版本,因为 INNER JOIN 在每个字段上。我觉得应该有一种更通用的方法来执行此操作,而不必手动输入所有连接条件。想法?

编辑:实际上,我认为我需要一个 C#/LINQ 答案,因为这将跨服务器完成。同样,这很烦人,因为我必须编写代码来手动比较每个字段。

var tableARows = dbA.TableA.ToList();
var tableBRows = dbB.TableB.ToList();
var match = 0;
foreach(tableARow in tableARows){
    if(tableBRows.Where(a=>a.Value1 = tableARow.Value1 && a.Value2 = tableARow.Value2).Any()){
        match++;
    }
}

return match;
4

4 回答 4

1

使用 sql server 这将起作用

 var sql="select count(0) from(
    select * from product except select * from product1
    ) as aa";

dc = dtataContext

var match= dc.ExecuteStoreQuery<int>(sql);
于 2012-08-15T18:59:37.803 回答
0

一个相当简单的答案:

select ( select count(*) from 
              (select * from TableA UNION ALL select * from TableB) a ) - 
       ( select count(*) from 
              (select * from TableA UNION select * from TableB) d ) duplicates
于 2012-08-15T19:18:07.547 回答
0

您查询 ANSI INFORMATION_SCHEMA 视图,因此:

select *
from INFORMATION_SCHEMA.COLUMNS col
where col.TABLE_SCHEMA = <your-schema-name-here>
  and col.TABLE_NAME   = <your-table-name-here>
order by col.ORDINAL_POSITION

针对所涉及的每个表。结果集将提供您即时构建所需查询所需的一切。

于 2012-08-15T19:01:43.757 回答
0

您可以使用 syscolumns 生成连接。

declare @tablenameA varchar(50) = 'tableA'
declare @tablenameB varchar(50) = 'tableB'

declare @sql nvarchar(4000)
select @sql =''
select @sql = @sql + ' and ' + quotename(@tablenameA )+ '.' 
       + c.name +' = ' + quotename(@tablenameB )+ '.' + c.name
from syscolumns c 
    inner join sysobjects o on c.id = o.id
where o.name = @tablenameA

select @sql = 'select count(*) from ' + @tablenameA + ' inner join '+@tablenameB+' on '
     + substring (@sql, 5, len(@sql))

exec sp_executesql @sql
于 2012-08-15T18:56:07.417 回答