如何在SQLServer中使用存储过程合并第三个表中的两个数据表?

如何在SQLServer中使用存储过程合并第三个表中的两个数据表?,sql,sql-server,algorithm,stored-procedures,Sql,Sql Server,Algorithm,Stored Procedures,表1 ----------------------------- Id | Batch | Qty ----------------------------- 1 A1 5 2 A2 5 3 A3 5 4 A4 5 表2 ----------------------------- Id | Batch

表1

-----------------------------
Id      | Batch    |   Qty
-----------------------------
   1       A1         5     
   2       A2         5      
   3       A3         5    
   4       A4         5
表2

-----------------------------
Id     | Batch  | Qty
------------------- ----------
1         A1        6    
2         A2        6    
3         A3        6     
5         A5       10
预期结果

-----------------------------
Id     | Batch  | Qty
-----------------------------    
1         A1       6 (Qty updated)    
2         A2       6 (Qty updated)    
3         A3       6 (Qty updated)    
4         A4       5 (remains as same)    
5         A5       10 (row in table 2)
如何在SQL Server中实现这一点?如果有人知道此数据表操作,请共享..

尝试以下操作:

Insert Into Table3
Select * From
((Select * from Table1
Except
Select * from Table2) as temp
UNION
(Select * from Table2))
您可以使用查询根据表2更新表1:

MERGE INTO Table1 as target
USING Table2 as source
ON (target.id = source.id)
WHEN MATCHED THEN 
    UPDATE SET target.Batch = source.Batch, 
               target.Qty = source.Qty
WHEN NOT MATCHED THEN   
    INSERT (Id, Batch, Qty)
    VALUES (source.Id, source.Batch, source.Qty)

假设
id
batch
始终相关,我们可以得到:

SELECT
    COALESCE(t2.id,t1.id) as id,
    COALESCE(t2.batch,t1.batch) as batch,
    COALESCE(t2.qty,t1.qty) as qty
FROM
     Table2 t2
         full outer join
     Table1 t1
         on
             t2.id = t1.id --Or on batch, or both?

既然您已经明确提到了
DataTables
,我将向您展示一个内存中的解决方案,该解决方案使用
LINQ To DataSet
和一个自定义
IEqualityComparer

DataTable tblMerged = Table2.AsEnumerable()
             .Union(Table1.AsEnumerable(), new RowIdComparer())
             .CopyToDataTable();
下面是定制的
DataRow
比较器,以确保ID用作区分:

class RowIdComparer : IEqualityComparer<DataRow>
{
    public bool Equals(DataRow r1, DataRow r2)
    {
        return r1.Field<int>("Id") == r2.Field<int>("Id");
    }

    public int GetHashCode(DataRow row)
    {
        return row.Field<int>("Id").GetHashCode();
    }
}

括号中的文字仅适用于我们?如果您提供您正在处理的确切sql server(ms sql、oracle等)@tchrikch,则可能会有所帮助。问题中的确有“sql server”字样-例如ms-sql。
class RowIdComparer : IEqualityComparer<DataRow>
{
    public bool Equals(DataRow r1, DataRow r2)
    {
        return r1.Field<int>("Id") == r2.Field<int>("Id");
    }

    public int GetHashCode(DataRow row)
    {
        return row.Field<int>("Id").GetHashCode();
    }
}
Id      Batch   Qty
1         A1    6
2         A2    6
3         A3    6
5         A5    10
4         A4    5