我有两个表A和B具有相同的列和结构我想比较两个表并将表B中的非匹配记录插入到另一个表中。我在用 C#和MYSql。
cnn.Open();
string Csql1 = "SELECT FILE_NAME, passport_number, applicant_name, applicant_dob, applicant_gender,issue_date, visa_number, fh_name, application_date, rowid FROM Data_Before_QC ORDER BY old_name ASC LIMIT 1";
da1 = new MySqlDataAdapter(Csql1, cnn);
da1.Fill(dt1);
//string[] arr1 = new string[dt1.Rows.Count];
string Csql2 = "SELECT FILE_NAME, passport_number, applicant_name, applicant_dob,applicant_gender,issue_date,visa_number, fh_name, application_date, rowid FROM Data_Afetr_QC ORDER BY old_name ASC LIMIT 1";
da2 = new MySqlDataAdapter(Csql2, cnn);
da2.Fill(dt2);
foreach (DataRow row1 in dt1.Rows)
{
foreach (DataRow row2 in dt2.Rows)
{
}
}
答案 0 :(得分:0)
你需要这样的东西:
string[] fields = new string[]{
"passport_number",
"applicant_name",
//and so on you should write all of your columns which you wanna update.
};
foreach (DataRow sourceRow in dt1.Rows)
{
var searchResult = from dRow in dt2.AsEnumerable()
where dRow["FILE_NAME"].Equals(sourceRow["FILE_NAME"])
select dRow;
if(!searchResult.Any())
continue;
foreach(string columnName in fields)
{
searchResult[columnName] = sourceRow[columnName];
}
}
请注意,这不会更新丢失的记录。为此你需要另外一个插入 @Richard 在评论中写下你如何。要使此代码生效,您需要添加using System.Linq;
。此外,我想您正在使用FILE_NAME来复制记录。
如果您认真考虑这样做,还有适合此类工作的工具。如果您无法负担工具而又想要更新少量表格,请查看Microsoft SMO。关于SMO,请注意性能不佳!
P.S下一次在问题上付出更多努力,在另一种情况下可能没有人会回答你!当你循环表时,想想要做什么并不难。
代码是即时构建的,因此可能会出错!
答案 1 :(得分:0)
更好地编辑像这样的SQL查询
SELECT * FROM(
SELECT FILE_NAME, passport_number, applicant_name, applicant_dob, applicant_gender,issue_date, visa_number, fh_name, application_date, rowid FROM Data_Before_QC ORDER BY old_name ASC LIMIT 1
EXCEPT
SELECT FILE_NAME, passport_number, applicant_name, applicant_dob,applicant_gender,issue_date,visa_number, fh_name, application_date, rowid FROM Data_Afetr_QC ORDER BY old_name ASC LIMIT 1) tmp
注意:代码未经过测试