我有两个版本的同一个表,并希望找到两者之间的差异:哪些行已更改?我使用减去查询两次来打印更改的行,因为它们出现在旧表和新表中。
现在我想添加一个新查询:显示特定列上已更改的行。
(select * from NewTable minus select * from OldTable) NewRows
inner join
(select * from OldTable minus select * from NewTable) OldRows
on NewRows.column1 = OldRows.column1
and NewRows.column2 <> OldRows.column2
其中column1是唯一的行id,第2列是更改的属性。
当我执行 Oracle SQL Developer 时,我收到错误 ORA-00933“SQL命令未正确结束”,并且他将NewRows的定义指示为错误。我也试过“)作为NewRows”,但它没有用。
以下查询确实有效,因此NewTable和OldTable是兼容的。
(select * from NewTable minus select * from OldTable)
union
(select * from OldTable minus select * from NewTable)
答案 0 :(得分:0)
在开头尝试使用其他select * from
:
select * from
(select * from NewTable minus select * from OldTable) NewRows
inner join
(select * from OldTable minus select * from NewTable) OldRows
on (NewRows.column1 = OldRows.column1 and NewRows.column2 <> OldRows.column2)
另请注意nulls
您的差异条件<>
不会涵盖一个值is null
和第二个is not null
的情况。您应该使用:
on (nvl(NewRows.column1, 'UNIQUEVAL1') = nvl(OldRows.column1, 'UNIQUEVAL1')
and nvl(NewRows.column2, 'UNIQUEVAL2') <> nvl(OldRows.column2, 'UNIQUEVAL2') )