0

嘿,我需要比较两个相同结构的表。

Table1
EmpNO - Pkey
EmpName
DeptName
FatherName
IssueDate
ValidDate

我需要传递EMPNOas 参数,我需要比较是否有任何列发生变化?并返回 YES OR NO 值。

我可以使用 PL/SQL 函数来做到这一点吗?我正在考虑使用CONCAT内置功能来做到这一点。

我正在尝试下面的

Table1Concat = Select CONCAT(Column1.....6) from tbale1 where emp_no= in_empno;
Table2Concat = Select CONCAT(Column1.....6) from tbale2 where emp_no= in_empno;

IF(Table1Concat<>Table2Concat  ) THEN return data_changed :='YES';
  else data_changed :='NO';
END;
4

1 回答 1

1

如果您只想检测是否有任何值不同,那么...

select count(*)
from (select * from table1 where emp_no = my_emp_no
      union 
      select * from table2 where emp_no = my_emp_no
      )

如果返回 1 则行相同,如果返回 2 则存在差异。

列的顺序必须相同才能正常工作,否则您必须按照它们匹配的顺序列出所有列名。

如果您想为大量行批量执行此操作,那么您很可能会使用不同的解决方案,不要循环遍历每个运行此代码的 emp_no。

对于两个表中都存在所有 emp_id 的批量数据,请使用以下形式的查询:

select table1.emp_no,
       case when table1.column1 = table2.column1 and 
                 table2.column2 = table2.column2 and
                 table2.column3 = table2.column3 and
                 ...
            then 'Yes'
            else 'No
       end columns_match
from   table1
join   table2 on table1.emp_no = table2.emp_no

您可以将此结果直接插入到日志记录表中。

不过要注意空值。“any_value = null”永远不会为真,“any_value != Null”也永远不会为真,因此您可能需要添加逻辑来处理一个或两个值为 null 的情况。

于 2013-09-02T07:05:43.087 回答