2017-05-22 366 views
0

希望有人能夠提供幫助。我正在嘗試更新聲明。我有一張桌子,上面有一列:
BUS_NBR_SK, BUS_NBR, EFF_DT, ENT_TMPSTP, EXP_DT如何更新以前的記錄而不更新Netezza中的最大記錄

主鍵是BUS_NBR_SKBUS_NBR。這裏只有一張桌子。

這是插入到一個表,我需要更新上了年紀的記錄EXP_DT和使用max(ENT_TMSTP)獨自離開最近的一次我只打算做一個更新與SET b.EXP_DT = current_timestamp其中EXP_DT IS NULL但這不會因爲最近的記錄也會被分配一個過期日期。

任何想法如何工作?

我已經嘗試過以下方法,但它是用最大生效日期更新所有內容。

UPDATE TABLE b 
SET b.EXP_DT = (SELECT MAX(a.EFF_DT) 
FROM TABLE A 
INNER JOIN TABLE B 
ON A.BUS_NBR_SK = B.BUS_NBR_SK 
AND A.ENT_TMSTP = B.ENT_TMSTP 
AND A.BUS_NBR = B.BUS_NBR) 
WHERE EXP_DT IS NULL 
and ENT_TMSTP != (select max(c.ENT_TMSTP) 
from table C) 

太謝謝你了!

example of the fields in the table with sample data.

+1

編輯你的問題,並用你正在使用的數據庫標記它。 –

回答

0

我不知道這是否會解決您的問題,但使用相關子查詢將至少獲得set邏輯正確:

UPDATE table b 
    SET b.EXP_DT = (SELECT MAX(a.EFF_DT) 
        FROM TABLE A 
        WHERE A.BUS_NBR_SK = B.BUS_NBR_SK AND 
          A.ENT_TMSTP = B.ENT_TMSTP AND 
          A.BUS_NBR = B.BUS_NBR 
        ) 
    WHERE b.EXP_DT IS NULL AND 
      b.ENT_TMSTP <> (SELECT MAX(c.ENT_TMSTP) FROM table C); 

我不知道如果這能解決儘管如此,你的整體問題。

+0

非常感謝您的及時回覆。我似乎得到一個語法錯誤:^發現「表」(在字符81)期待'WITH'或''('' –

+0

我想我只想走這條路線並將exp_date設置爲當前時間戳如下所示: UPDATE TABLE b SET b.EXP_DT = current_timestamp並避免最新的記錄被更新當我試圖實現這個時,我總是收到錯誤 –

+0

@RoxanneLuick ...對'TABLE'的引用在你原來的查詢,它不是SQL語法的一部分,表名應該跟在'FROM'後面的別名之後。 –

0

如果你想與a.EFF_DT日期爲最新的記錄BUS_NBR_SK,ENT_TMSTP和BUS_NBR的特定按鍵,你可以通過查看某個創建組,也可以聲明它的更新中更新b.EXP_DT查詢,如下所示:

UPDATE表b SET b.EXP_DT = A_Group.Max_EFF FROM表A INNER JOIN (SELECT BUS_NBR_SK,ENT_TMSTP,BUS_NBR,MAX(A.EFF)作爲Max_EFF FROM乙 GROUP BY BUS_NBR_SK,ENT_TMSTP,BUS_NBR)AS A_Group ON A_Group.BUS_NBR_SK = b.BUS_NBR_SK AND A_Group.ENT_TMSTP = b.ENT_TMSTP AND A_Group.BUS_NBR = b.BUS_NBR WHERE b.EXP_DT IS NULL AND b.ENT_TMSTP <>(A_Group.Max_EFF);

希望它有幫助。 Sergio

+0

我修改了這個,並得到一個新的錯誤:FROM中的子SELECT必須有一個別名。我之前沒有很多次子查詢使用過更新。 –