跨同服务器两数据库关联一对多表,对比资产/设备数据
跨库对比Asset与Equipment数据的实操方案
先把你的表关联逻辑理清楚(方便后续写SQL):
- 数据库1(我暂且叫它
DB1,你换成真实库名):Table1(Application主表)的APP_KEY是主键,关联Table2(Asset从表)的AS_APP_FKEY,是一对多关系 - 数据库2(叫
DB2):Table3(Application主表)的ApplicationId是主键,它的可空字段App_Key对应DB1.Table1.APP_KEY;Table4(Equipment从表)应该是通过外键关联Table3.ApplicationId(你没写完结构,我先假设外键叫Equip_App_Fkey,实际替换成你的真实字段)
下面分两种最常见的对比场景给你写SQL示例:
场景1:找同一Application下,Asset存在但Equipment缺失(或反之)
比如你想知道DB1里有的资产,DB2对应的应用下有没有没同步过去的设备:
SELECT a.APP_KEY AS 关联应用Key, ast.SampleAsset1, ast.SampleAsset2, ast.SampleAsset3 FROM DB1.dbo.Table1 a INNER JOIN DB1.dbo.Table2 ast ON a.APP_KEY = ast.AS_APP_FKEY -- 跨库关联到DB2的Application表 LEFT JOIN DB2.dbo.Table3 a2 ON a.APP_KEY = a2.App_Key -- 关联DB2的Equipment表 LEFT JOIN DB2.dbo.Table4 eq ON a2.ApplicationId = eq.Equip_App_Fkey WHERE a2.App_Key IS NOT NULL -- 只对比两边都存在的应用(如果要包含DB1独有应用,去掉这个条件) AND eq.Equip_App_Fkey IS NULL; -- 筛选出DB2中无对应设备的资产
如果要反过来找Equipment存在但Asset缺失的记录,把表的关联顺序调换就行。
场景2:对比同一关联关系下的字段值差异
假设Table4也有对应SampleAsset1-3的字段(比如SampleEquip1、SampleEquip2、SampleEquip3),要找出两边字段值不一样的记录:
SELECT a.APP_KEY AS 关联应用Key, ast.SampleAsset1 AS 资产样本1, eq.SampleEquip1 AS 设备样本1, ast.SampleAsset2 AS 资产样本2, eq.SampleEquip2 AS 设备样本2, ast.SampleAsset3 AS 资产样本3, eq.SampleEquip3 AS 设备样本3 FROM DB1.dbo.Table1 a INNER JOIN DB1.dbo.Table2 ast ON a.APP_KEY = ast.AS_APP_FKEY INNER JOIN DB2.dbo.Table3 a2 ON a.APP_KEY = a2.App_Key INNER JOIN DB2.dbo.Table4 eq ON a2.ApplicationId = eq.Equip_App_Fkey WHERE -- 对比字段值不一致的情况,注意处理NULL(因为NULL和任何值比较都返回UNKNOWN) ast.SampleAsset1 <> eq.SampleEquip1 OR ast.SampleAsset2 <> eq.SampleEquip2 OR ast.SampleAsset3 <> eq.SampleEquip3 OR (ast.SampleAsset1 IS NULL AND eq.SampleEquip1 IS NOT NULL) OR (ast.SampleAsset1 IS NOT NULL AND eq.SampleEquip1 IS NULL) OR (ast.SampleAsset2 IS NULL AND eq.SampleEquip2 IS NOT NULL) OR (ast.SampleAsset2 IS NOT NULL AND eq.SampleEquip2 IS NULL) OR (ast.SampleAsset3 IS NULL AND eq.SampleEquip3 IS NOT NULL) OR (ast.SampleAsset3 IS NOT NULL AND eq.SampleEquip3 IS NULL);
几个关键注意点
- 替换真实名称:把SQL里的
DB1、DB2换成你的实际数据库名,Equip_App_Fkey、SampleEquip1-3换成Table4的真实字段名 - NULL值处理:一定要单独判断NULL的情况,否则会漏掉大量差异记录
- 性能优化:如果数据量很大,给
APP_KEY、App_Key、两个从表的外键字段加索引,避免全表扫描拖慢查询 - 批量统计:如果需要统计每个应用下的差异数量,可以加
GROUP BY a.APP_KEY,配合COUNT(*)来实现
内容的提问来源于stack exchange,提问作者nevertilt19
相关产品推荐
相关产品推荐

