2015-06-03 46 views
-1

我有一張名爲「Input_Data」的表格,如下所示,從這張表格中我將獲取其他表格的輸入值。使用其他表格數據更新新表格,在新表格中進行少量修改

**TN   start_date operator** 
12345  12-May-2015  123 
67890  14-May-2015  456 

而另一臺「Output_data」,如下圖,該表將得到更新,按照從「Input_Data」

**SOURCE_ID EFFECTIVE_DATE EXPIRATION_DATE PROVIDER_ID** 
    12345  01-Jan-2014      555 

由於12345 SOURCE_ID已經存在於Output_Data表未來值,在這種情況下,我想更新來自「Input_Data」表的source_id 12345的條目,使得「Output_Data」表中的較早條目將與新條目的start_date一起過期。另一行將插入新條目。因此,「Output_Data」應如下:

**DEST_ID  EFFECTIVE_DATE EXPIRATION_DATE PROVIDER_ID** 
    12345   01-Jan-2014 12-May-2015  555 
    12345   12-May-2015      123 
    67890   14-May-2015      456 

我新的SQL,並與一些查詢試圖像下面的上述任務:

select A.TN, A.START_DATE, A.OPERATOR, NVL(A.expiration_date, 
     to_date('31-12- 9999 00:00:00','DD-MM-YYYY hh24:mi:ss')) 
from 
    (select tn,start_date,destination, 
    Lead(effective_date) over (partition by tn order by effective_date) as expiration_date 
    from 
     (select op.DEST_ID tn, op.EFFECTIVE_DATE start_date, 
       op.PROVIDER_ID destination 
     from Output_Data op, Input_Data ip where op.DEST_ID=ip.TN 
     union 
     select ip.TN tn, ip.start_date effective_date, ip.operator destination 
     from Input_Data ip) T) A 
     where effective_date != NVL(expiration_date,to_date('31-12-9999','DD-MM-YYYY hh24:mi:ss')) 

但上面的查詢甚至沒有得到執行,所以我我無法檢查輸出。

+2

您標記爲mysql,sql-server和oracle!?查詢是否適用於每個DBMS? – CeOnSql

+4

您錯過了'PostgreSQL'和'DB2'。 –

+0

我已經標記了所有這些只是爲了得到答案。我期待在Oracle上運行的查詢。 –

回答

2

前downvoting閱讀:問題被張貼與SQLSERVER,MySQL和Oracle標籤,甲骨文的答案是還沒有準備好,就可以了

工作這是SQLSERVER:

UPDATE output_data 
SET expiration_date = 
(select start_date 
FROM input_data 
where TN = output_data.source_id); 

INSERT INTO output_data(source_id, effective_date,provider_id) 
SELECT TN,start_date,operator FROM input_data; 

SQLFIDDLE

完全相同的代碼適用於MySQL的:

SQLFIDDLE

+0

目前在mysql上工作,之後會執行oracle –

+0

這對oracle不起作用,現在正在處理它 –

+0

我的小提琴不斷出現無效的SQL語句雖然文檔支持我寫的東西應該適用於Oracle,但是Oracle不會像其他所有的東西一樣 –