查询TA与TB中主键相同但属性值不同的记录(SQL/Linq实现)
查找影子表与原表的差异记录
SQL 实现
通过**内连接(INNER JOIN)**关联两张表的主键,再筛选属性值不一致的记录即可:
SELECT TA.* FROM TA INNER JOIN TB ON TA.PK = TB.PK WHERE TA.Value1 != TB.Value1 OR TA.Value2 != TB.Value2;
如果需要同时查看两张表的对比数据,可调整返回字段:
SELECT TA.PK, TA.Value1 AS TA_Value1, TB.Value1 AS TB_Value1, TA.Value2 AS TA_Value2, TB.Value2 AS TB_Value2 FROM TA INNER JOIN TB ON TA.PK = TB.PK WHERE TA.Value1 != TB.Value1 OR TA.Value2 != TB.Value2;
LINQ(EF Core/EF)实现
假设你的DbContext中定义了DbSet<MyData> TA和DbSet<MyData> TB,提供两种实现方式:
方式1:使用Join关联筛选
var changedRecords = from ta in context.TA join tb in context.TB on ta.PK equals tb.PK where ta.Value1 != tb.Value1 || ta.Value2 != tb.Value2 select ta;
方式2:使用Where+Any匹配主键并判断差异
var changedRecords = context.TA .Where(ta => context.TB.Any(tb => tb.PK == ta.PK && (tb.Value1 != ta.Value1 || tb.Value2 != ta.Value2)));
若需要获取两张表的对比详情,可返回自定义匿名类型:
var changedDetails = from ta in context.TA join tb in context.TB on ta.PK equals tb.PK where ta.Value1 != tb.Value1 || ta.Value2 != tb.Value2 select new { PK = ta.PK, TA_Value1 = ta.Value1, TB_Value1 = tb.Value1, TA_Value2 = ta.Value2, TB_Value2 = tb.Value2 };
内容的提问来源于stack exchange,提问作者Razzupaltuff
相关产品推荐
相关产品推荐

