【问题标题】:Comparing two tables to see for any change in column in PL/SQL比较两个表以查看 PL/SQL 中列的任何变化
【发布时间】:2014-08-23 18:19:30
【问题描述】:

有一张表,里面有员工的价值观和他们的中间名

ID FIRST NAME    MIDDLE NAMES

1  'ABC'          
2  'Jck'           w
3   'Zoya'         A

现在有另一个带有一些值的表 B

ID FIRST NAME    MIDDLE NAMES   Flag

    4  'XYZ'          
    2  'Jck'           
    1   'ABC'         A

现在我想在表 B 中检查,如果 B 中的中间名与表 A 的中间名相同。即中间名存在于表 A 而不是 B 中针对相同的员工编号,反之亦然,那么标志应该是返回为“N”

我正在使用查询:

update table b
set flag='N'
WHERE NOT EXISTS ( SELECT 1 FROM TABLE B
WHERE B.MIDDLE_NAMES=A.MIDDLE_NAME
AND ID=A.ID)

【问题讨论】:

  • 如果你想返回一个值,你用update做什么?你真正想做什么?
  • 当特定员工的两个表中的中间名存在任何差异时,我想将标志设置为“N”

标签: sql oracle plsql plsqldeveloper


【解决方案1】:

您的子查询应该有更多的条件,而不仅仅是中间名。目前,子查询只检查中间名,因此如果表 A 中的某个人的中间名出现在表 B 中的任何地方,那么即使它是针对不同的人,您也有匹配项。

要在 A 中查找在 B 中没有匹配中间名的员工,查询可能如下所示:

select
  a.ID
from
  TableA a
where
  not exists (
    select 'x'
    from 
      TableB b
    where
      b.ID = a.ID and
      b.MIDDLE_NAMES = a.MIDDLE_NAMES);

您可以在更新中使用相同的查询:

update TableA a
set
  a.flag = 'N'
where
  a.ID in (
    select
      a.ID
    from
      TableA a
    where
      exists (
        select 'x'
        from 
          TableB b
        where
          b.ID = a.ID and
          b.MIDDLE_NAMES = a.MIDDLE_NAMES));

更新可能会更简单一些,但是像这样使用整个查询的好处是,您可以轻松检查其输出,而无需实际更新记录。它使开发、测试和调试变得更加容易。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-27
    • 2019-05-27
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多