SQL Server中无唯一标识符的两个表如何对比及WITH语法错误解决
SQL Server无唯一标识同结构表对比问题修复
报错原因
你的代码存在3处语法错误,直接触发了WITH关键字附近的语法报错:
- 多CTE语法不符合规范:SQL Server定义多个公共表表达式时,仅第一个CTE需要加
WITH关键字,后续CTE用逗号分隔即可,无需重复声明WITH - 列之间缺少分隔符:
SELECT和ORDER BY子句中的Customer、Account、address三个列没有用逗号分隔,如果你的列名实际包含空格,还需要用方括号[]包裹列名 - 表名拼写错误:关联时写的
traget为拼写错误,正确表名是你定义的target
修正后的代码
WITH source AS ( SELECT ROW_NUMBER() OVER(ORDER BY Customer, Account, address) AS RowN, Customer, Account, address FROM old ), target AS ( SELECT ROW_NUMBER() OVER(ORDER BY Customer, Account, address) AS RowN, Customer, Account, address FROM New ) SELECT s.address AS s_address, t.address AS t_address FROM source s JOIN target t ON s.RowN = t.RowN WHERE s.Customer != t.Customer OR s.Account != t.Account OR s.address != t.address
优化建议
- 使用行号对比的前提是两个表的
ORDER BY排序逻辑完全一致,确保相同业务含义的行能匹配到同一个RowN值 - 如果两个表可能存在行数不一致的情况,建议将
JOIN改为FULL OUTER JOIN,可以同时匹配出仅存在于old表或仅存在于New表的行,避免遗漏差异。
内容的提问来源于stack exchange,提问作者Anson
相关产品推荐
相关产品推荐

