如何在SQLServer中使用存储过程合并第三个表中的两个数据表?
表1如何在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
-----------------------------
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