2017-02-21 34 views
0

我有一張以下性質的表格。該表所在數據庫上的事務處理過程遵循用戶可以更改一個,多個或所有項目的交付日期的路徑。現在,我想要的是一組用戶更新對應於特定項目的交付日期的行。您可以看到PO_Number與所有項目相同,PO_Date也相同。那麼,如何查詢和顯示所需的行?根據特定的記錄命中和更新時間進行數據過濾

PO_NO  PO_DT  ITEM_CODE DEL_DATE UPDATED_ON OLD_DEL_DATE  NEW_DEL_DATE 
======================================================================================== 
01T0/05/2015 UP01662 24/06/2015 23/5/2015  20/06/2015  24/06/2015 
01T0/05/2015 UP01762 22/06/2015 21/5/2015  20/06/2015  22/06/2015 
01T0/05/2015 UP01661 24/06/2015 23/5/2015  20/06/2015  24/06/2015 
01T0/05/2015 UP01763 22/06/2015 21/5/2015  20/06/2015  22/06/2015 

也請考慮這樣一個場景,如果用戶確實他的最後一次交易和更新交付日期item_code-(UP01662,UP01661)爲在一天(說)10次。然後最後,我想要的只是一個查詢,它只爲這兩個項目提取數據集,而沒有其他任何東西。

任何幫助將不勝感激。

+0

我不是當然我明白你需要什麼。如果您發佈的數據是需要的結果,您可以發佈初始數據嗎?或者,如果這是起始數據,結果應該是什麼? – Aleksej

+0

請大家讓我知道,如果我需要在這裏詳細說明問題。 我真的需要一個解決方案。 – hashir

+0

這是起始數據。我將爲你詳細說明流程。 用戶通過表單更新給定數據,受影響的列爲 - UPDATED_ON,OLD_DEL_DATE和NEW_DEL_DATE。 現在,觸發器會在每次更新時被觸發,並且觸發器應該獲取這三列已更新的行。 可能有多種情況,例如,用戶更新了訂單的兩個項目。所以,查詢應該只提取這兩行而不是其他行。 現在,如果您對「問題」有任何疑問? – hashir

回答

0

我認爲這可能幫助ü有點https://social.msdn.microsoft.com/Forums/sqlserver/en-US/4a0742b7-b976-42b7-8230-4ae46441a63a/when-was-the-last-time-a-record-was-addedmodified-in-a-sql-table?forum=transactsql

declare @objectid int 
    select @objectid = object_id from sys.objects where name = 'YOURTABLENAME' 

    select top 1 * from sys.dm_db_index_usage_stats where object_id = @objectid 
    and last_user_update is not null 
    order by last_user_update 
+0

這不是Oracle – Aleksej

+0

@ venky513我需要在oracle sql中做到這一點,sql server在這裏沒有問題。 感謝您考慮問題。如果您可以爲oracle sql提供解決方案,那將是非常好的。 – hashir

+0

@Aleksej 是的,你能提供一個嗎? – hashir

0

的想法是如果有一列被改爲創建自定義函數來檢查和更新後觸發。如果您知道某些列必須始終隨着每次更新而更改,否則更容易檢查您的行是否已更改 - 否則,您必須檢查user_tab_columns中的所有列以查找表。

對於通用的方法,請檢查: https://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:59412348055

+0

每當更新時,UPDATED_ON列都會更改。 問題是通過可以是函數,過程或遊標的單獨查詢獲取受影響的行。請同時告訴我是否:除了在觸發器中使用以外,還可以在一般查詢中使用old和:new。 – hashir

+0

從提供的鏈接:: new和:old就像綁定變量到觸發器,它們不是「常規」變量。你不能動態訪問它們。如果你想有一個沒有被觸發器調用的函數,那麼何時調用它?它會檢查是否有任何記錄是從那時起改變的?您可以存儲上一次檢查或鏡像表格圖像並檢查它。 – Alex

+0

這個問題不是觸發器兄弟。我所需要的只是一個查詢,它可以獲取最後一次更新的行,而不是其他任何東西。這是我能說得最簡單的方法。 – hashir

0

請讓我知道,如果這是你所需要的。

create table xx_ap_orders ( po_number varchar2(10) 
          , item_code varchar2(10) 
          , amount number 
          , updated_date date 
          ); 

因此,該方案是:

所有記錄4天前進行了更新

用鼠標項代碼行被更新5天前

電纜BATERY項目代碼進行了更新2幾天前。

記錄表看起來像:

insert into xx_ap_orders values ('PO_500','LAPTOP', 3500, trunc (sysdate - 5)); 
insert into xx_ap_orders values ('PO_500','MOUSE', 200, trunc (sysdate - 4)); 
insert into xx_ap_orders values ('PO_500','CABLE', 100, trunc (sysdate - 2)); 
insert into xx_ap_orders values ('PO_500','BATERY', 500, trunc (sysdate - 2)); 

如果你想只選擇CABLE和BATERY記錄(最後更新),您有以下SQL:

SELECT * FROM (
SELECT po_number 
     , item_code 
     , amount 
     , updated_date 
     , rank() OVER (PARTITION BY po_number 
        order by updated_date desc) rank_updated 
FROM XX_AP_ORDERS) 
WHERE rank_updated = 1 
; 
+0

盡心盡力@Alex。但是這個解決方案只是短了一步。當我第一次更新UPDATED_DATE列時,一切順利,只有受影響的行通過您提供的查詢獲取。但是當我更新任何其他項目時(第二次更新期間),解決方案無法滿足我的要求。假設,我在第一輪只更新了一行(比如說)'BATERY'。我運行查詢,一行平滑結果。 – hashir

+0

下一輪,我更新'LAPTOP'和'MOUSE',然後運行查詢,獲取的結果現在有3行,包括第一輪更新的行。我需要的是,在每輪運行後,查詢應僅返回受影響的行/僅在該輪中而不在之前的輪中。 – hashir

+0

UPDATE xx_ap_orders SET amount = amount +50 ,updated_Date = sysdate; - 運行查詢:所有4個記錄取出 UPDATE xx_ap_orders SET量=量 - 50 ,updated_Date = SYSDATE WHERE ITEM_CODE IN( '鼠標', 'CABLE'); - 運行查詢:獲取2條記錄 – Alex

相關問題