同机SQL数据库两Vendor表对比:获取DB2独有的Stock记录
解决方案:找出DB2.Vendor独有的记录
先拆解你那两个语句的问题:
- 第一个语句里的
Where (Stock != Stock)是无效条件——同一行的Stock不可能不等于自身,相当于直接过滤掉DB2的所有数据,所以Except自然返回空结果。 - 第二个语句用
Union后加Group by Vendor.Stock报错,是因为Union合并后的结果中,仅按Stock分组但查询所有字段,数据库无法确定非分组字段的取值规则,语法不合法。
下面是三种可行的写法,按需选择:
方法1:NOT EXISTS(推荐,性能更优)
SELECT * FROM DB2.Vendor db2_v WHERE NOT EXISTS ( SELECT 1 FROM DB1.Vendor db1_v WHERE db1_v.Stock = db2_v.Stock )
逻辑:遍历DB2的每条记录,检查DB1中是否存在相同Stock值的记录,无匹配则保留该DB2记录。
方法2:LEFT JOIN + IS NULL
SELECT db2_v.* FROM DB2.Vendor db2_v LEFT JOIN DB1.Vendor db1_v ON db1_v.Stock = db2_v.Stock WHERE db1_v.Stock IS NULL
逻辑:将两张表按Stock左连接,DB1无匹配的记录会显示NULL,过滤出这些行即为DB2独有的数据。
方法3:正确使用EXCEPT
SELECT * FROM DB2.Vendor EXCEPT SELECT * FROM DB1.Vendor
注意:该写法要求两张表所有字段的结构、数据类型完全一致,且会自动去重。如果DB2内存在重复Stock的记录,EXCEPT仅保留一条;若需保留DB2的全部重复记录,优先选用前两种方法。
内容的提问来源于stack exchange,提问作者BEE
相关产品推荐
相关产品推荐

