2015-09-29 16 views
1

我有兩個表,EVENTEVENT_REVH2,如何使用嵌套選擇進行更新?

事件:

╔══════════╦════════════════════╗ 
║ EVENT_ID ║ SENT_INTO_WF_BY_ID ║ 
╠══════════╬════════════════════╣ 
║  1 ║ null    ║ 
║  2 ║ null    ║ 
║  3 ║ null    ║ 
║  4 ║ null    ║ 
║  5 ║ null    ║ 
╚══════════╩════════════════════╝ 

和EVENT_REV:

╔══════════════╦══════════╦═════════╦════════╦════════════╦══════════╗ 
║ EVENT_REV_ID ║ EVENT_ID ║ USER_ID ║ STATUS ║ VALID_FROM ║ VALID_TO ║ 
╠══════════════╬══════════╬═════════╬════════╬════════════╬══════════╣ 
║   1 ║  1 ║  54 ║  0 ║  1000 ║ 1001  ║ 
║   2 ║  1 ║  55 ║ 100 ║  2000 ║ 2001  ║ 
║   3 ║  1 ║  56 ║ 200 ║  3000 ║ 3001  ║ 
║   4 ║  2 ║  57 ║  0 ║  4000 ║ 4001  ║ 
║   5 ║  3 ║  58 ║  0 ║  5000 ║ 5001  ║ 
║   6 ║  3 ║  59 ║ 100 ║  6000 ║ null  ║ 
║   7 ║  4 ║  60 ║  0 ║  7000 ║ null  ║ 
║   8 ║  5 ║  61 ║ 500 ║  8000 ║ 8001  ║ 
║   9 ║  5 ║  62 ║ 600 ║  9000 ║ 9001  ║ 
╚══════════════╩══════════╩═════════╩════════╩════════════╩══════════╝ 

我想更新事件表,並設置SENT_INTO_WF_BY_ID 的規則,這是:

  • event_ids應該匹配(EVENT.EVENT_ID = EVENT_REV.EVENT_ID)
  • 取STATUS不等於具有最低VALID_FROM的STATUS的行。這應該是與第二最低VALID_FROM
  • 從該行的行,取USER_ID

例如: 對於EVENT_ID = 1它應該選擇從EVENT_REV第2行並且把USER_ID 55進SENT_INTO_WF_BY_ID

因爲內部連接是不允許的H2,我的查詢看起來是這樣的:

UPDATE event ltm 
SET ltm.sent_into_wf_by_id = 
    (SELECT top 1 ltmRev.user_id 
    FROM event_rev ltmRev 
    WHERE ltmRev.event_id = ltm.event_id 
    AND ltmRev.status != 
     (SELECT top 1 EVENT_REV.status 
     FROM EVENT_REV 
     ORDER BY valid_from ASC nulls LAST) 
    ORDER BY ltmRev.valid_to ASC nulls LAST) 

結果應該是這樣的:

╔══════════╦════════════════════╗ 
║ EVENT_ID ║ SENT_INTO_WF_BY_ID ║ 
╠══════════╬════════════════════╣ 
║  1 ║ 55     ║ 
║  2 ║ null    ║ 
║  3 ║ 59     ║ 
║  4 ║ null    ║ 
║  5 ║ 62     ║ 
╚══════════╩════════════════════╝ 

,但實際上它是:

╔══════════╦════════════════════╗ 
║ EVENT_ID ║ SENT_INTO_WF_BY_ID ║ 
╠══════════╬════════════════════╣ 
║  1 ║ 55     ║ 
║  2 ║ null    ║ 
║  3 ║ 59     ║ 
║  4 ║ null    ║ 
║  5 ║ 61 <-- wrong  ║ 
╚══════════╩════════════════════╝ 

回答

1

可以用下面的查詢解決它:

UPDATE ltm_op_risk_event ltm 
SET ltm.sent_into_wf_by_id = 
    (SELECT ltmRev.adm_user_id 
    FROM ltm_op_risk_event_rev ltmRev 
    WHERE ltmRev.ltm_op_risk_event_id = ltm.ltm_op_risk_event_id 
    AND ltmRev.status != 
     (SELECT ltmRev2.status 
     FROM LTM_OP_RISK_EVENT_REV ltmRev2 
     WHERE valid_from IS NOT NULL 
      AND ltmRev.ltm_op_risk_event_id = ltmRev2.ltm_op_risk_event_id 
     ORDER BY valid_from ASC LIMIT 1) 
    ORDER BY ltmRev.valid_to ASC LIMIT 1) 
WHERE ltm.sent_into_wf_by_id IS NULL; 

缺少的部分是在最裏面選擇AND ltmRev.ltm_op_risk_event_id = ltmRev2.ltm_op_risk_event_id。我首先用錯誤的連接測試了這個連接...