如何以最佳方式比较两个表

时间:2014-07-21 08:12:08

标签: sql oracle

两个表中的数据具有相同数量的comuns(无主键)-table a表示活动记录,表b表示特定公司的非活动记录。状态“A”表示活动,“I”表示非活动

它们都有相同数量的列。如何比较表a和表b中的数据 如果b中存在记录而不是a,则A中的状态列必须设置为“I”否则为“A”

例如: -

表A

COL1 COL 2 COL3         STATUS
1    one   this is one   A
2    TO    THIS IS TO    I


Table B

Col1 col2  Col 3        status
3    THREE 33             A
4    for   this is for    A

现在在表B中col1与1不存在虽然它存在于表A中,状态为A. 因此,在比较表B和表A之后,我们将

 update table a 
set status ='I'
where col1 =1;

但我不知道如何比较这两张桌子?请帮助?

2 个答案:

答案 0 :(得分:1)

我对表a和表b感到困惑,如果a中没有记录,如何将表a中的状态设置为'A'?

在任何情况下,我都会使用MERGE来更改表中的状态列,具体取决于另一个表中的值:

MERGE INTO table_a 
USING table_b
   ON (table_a.col1 = table_b.col1 /* add other columns */)
 WHEN MATCHED THEN 
      UPDATE SET status = 'I' 
       WHERE status <> 'I';

如果在table_a中找到状态,则会在table_b中设置状态。您必须指定用于标识/* add other columns */所在列的相同列的列。请注意NULL值......

答案 1 :(得分:0)

获取B中而不是A

中的记录
  select Col1,
         Col2
    from B 

  minus -- <- Oracle/PL SQL specific; other dialects use 'except'

  select Col1,
         Col2
    from A 

要更新A,您可以执行以下操作:

  update A
     set status = case
           when (Col1, Col2) in (
             select B1.Col1,
                    B1.Col2
               from B B1
              minus
             select A1.Col1,
                    A1.Col2
               from A A1) then
             'I'
           else 
             'A'
         end