2014-07-21 67 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值...

相關問題