2014-07-21 34 views
1

有两个表中的数据具有相同数量的comuns(无主键) - 活动记录的表a和特定公司的不活动记录的表b。状态“A”用于激活,“I”用于不活动如何以最佳方式比较两个表

它们都有相同的列数。如何比较表a和表b中的数据,以便 如果记录存在于b中而不是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; 

但我没有得到如何比较这两个表?请帮忙?

+0

http://stackoverflow.com/questions/5557991/minus-vs-except-difference-in-oracle-sql-server – realnumber3012

回答

0

为了得到记录,在B和不在A

select Col1, 
     Col2 
    from B 

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

    select Col1, 
     Col2 
    from 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 
+1

嗨@dmitry我想我应该使用 - (arithemitic)而不是minus .......减号没有给出预期的结果 – user3809240

+0

编号@Dimitry Bychenko是对的。此处的“减号”表示“将所有处于第一次选择状态但不在第二次选择中的记录”。除非只有数字列进行比较,否则不能使用算术运算符减号( - ),并检查其差值是否为0.如果出现意外结果,尝试排除(可能来自两个选择)可能不同的列,邮票。 – B0Andrew

1

我对表和表B困惑,如何如果没有记录,可以将表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值...

相关问题