2016-11-23 62 views
0

我有兩個表,table1包含舊值,table2包含最新值,我想在table1中顯示最新值,但我沒有任何內容告訴我這是表2中的最新值。
例如
表1Oracle從其他表中獲取最新值

CID-----PID-----RID 
CT1-----C-------R1 
CT2-----C-------R2  
CT3-----C-------R3 
CT4-----C-------R4 

表2

CID-----PID----RID  
CT1-----A-------R1 
CT1-----C-------R11 
CT2-----C-------R2  
CT3-----A-------R3 
CT4-----A-------R4 

的條件是我必須在情況下值C優先兩個值(A和C)也存在它的RID變化,從而需要得到這也在輸出表中,對於相同的CID和獨特的價值,我會簡單地將其替換成表1中的table1,因此輸出將是這樣的

表3

CID-----PID----RID 
CT1-----C-------R11 
CT2-----C-------R2  
CT3-----A-------R3 
CT4-----A-------R4  

回答

0

我可能失去了一些東西,但不是這只是:

select cid, max(pid) 
from table2 
group by cid; 

如果你想整個記錄,使用排名與ROW_NUMBER代替:

select cid, pid, rid 
from 
(
    select cid, pid, rid, row_number() over (partition by cid order by pid desc) as rn 
    from table2 
) 
where rn = 1; 

您還可以使用例如:

(partition by cid order by case pid when 'C' then 1 when 'A' then 2 else 3 end) as rn 

UPDATE:現在,你終於解釋你是什麼後...

您想了解更多或更少的我給你上面的第二個查詢。只有你需要來自兩個表的數據,你可以用UNION ALL得到數據。你可以很容易地給每一行的秩的方式:

  • table2的PIM C =>秩#1
  • table2的PIM A =>秩#2
  • table1的秩#3

然後再取最好的等級行:

select cid, pid, rid 
from 
(
    select cid, pid, rid, row_number() over (partition by cid order by rnk) as rn 
    from 
    (
    select cid, pid, rid, case when pid = 'C' then 1 else 2 end as rnk from table2 
    union 
    select cid, pid, rid, 3 as rnk from table1 
) 
) 
where rn = 1; 
+0

它不是,在我實際的表我可以有PID值CED和地址,但實際上它是一個好主意,我可以某處使用此其他。 – Russel

+0

我已根據您編輯的要求更新了我的答案。我希望這是你正在尋找的。 –

+0

*表*中已經有兩列PID和RID。到目前爲止,你似乎已經有了你實際上不需要的table1和包含真實數據的table2。所以刪除(即刪除)table1,你會很好,我會說。我不知道你爲什麼想要*更新* table1。這意味着存儲數據冗餘,你不應該這樣做。或者是table2只是一個你想在之後刪除的臨時事情? –

相關問題