0

C# (LINQ-to-SQL) または SQL で、構造が一致する 2 つのテーブルを取得し、TableB にある TableA の行数をカウントするジェネリック関数を作成するにはどうすればよいですか?

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サーバーを使用すると、これが機能します

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

dc = データのコンテキスト

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

1つのかなり簡単な答え:

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

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 に答える
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 に答える