在使用减号构造的两个表上应用内部联接

时间:2017-02-13 11:05:44

标签: sql oracle

我有两个版本的同一个表,并希望找到两者之间的差异:哪些行已更改?我使用减去查询两次来打印更改的行,因为它们出现在旧表和新表中。

现在我想添加一个新查询:显示特定列上已更改的行。

(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) 

1 个答案:

答案 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') )