簡體   English   中英

如何按特定順序從select中進行Oracle SQL更新?

[英]How do I do an Oracle SQL update from select in a specific order?

我有一個表,其中包含舊值(一些null)和各種屬性的新值,所有這些值在整個月的不同添加時間插入。 我正在嘗試使用工作月結束日期的記錄更新第二張表。 目前,這些記錄僅包含所有月末日期的最新值。 目的是通過使用第一個表中的舊值更新前一個月末值來創建歷史數據。 我是一個初學者,能夠提出一個查詢來更新第一個表中有一個條目的一個對象。 現在,我試圖將查詢擴展為包含多個對象,並且可能在一個月內包含多個舊值。 我嘗試使用“ order by”(因為我需要按升序進行一個月的更新,以便它獲取最新值),但讀取內容在沒有子查詢的情況下不適用於update語句。 因此,我嘗試進行更復雜的查詢,但沒有成功。 我收到以下錯誤:單行子查詢返回多個行。 謝謝!

表A:

| ID | TYPE | OLD_VALUE | NEW_VALUE | ADD_TIME|
-----------------------------------------------
| 1 | A     | 2 | 3 | 1/11/2019 8:00:00am |
| 1 | B     | 3 | 4 | 12/10/2018 8:00:00am|
| 1 | B     | 4 | 5 | 12/11/2018 8:00:00am|
| 2 | A     | 5 | 1 | 12/5/2018 08:00:00am|
| 2 | A     | 1 | 2 | 12/5/2019 09:00:00am|
| 2 | A     | 2 | 3 | 12/5/2019 10:00:00am|
| 2 | B     | 1 | 2 | 12/5/2019 10:00:00am|

表B

| ID | MONTH_END | TYPE_A | TYPE_B | 
-----------------------------------
| 1  | 1/31/19  | 3  | 5 |
| 1  | 12/31/18 | 3  | 5 |
| 1  | 11/30/18 | 3  | 5 |
| 2  | 12/31/18 | 3  | 2 |
| 2  | 11/30/18 | 3  | 2 |

TableB的所需輸出

| ID | MONTH_END | TYPE_A | TYPE_B | 
-----------------------------------
| 1  | 1/31/19  | 3  | 5 |
| 1  | 12/31/18 | 2  | 5 |
| 1  | 11/30/18 | 2  | 3 |
| 2  | 12/31/18 | 3  | 2 |
| 2  | 11/30/18 | 5  | 2 |

我對類型A的查詢(我打算適應類型B並為所需的輸出執行)

update TableB B
set b.type_a =
(
    with aa as
    (
    select id, nvl(old_value, new_value) typea, add_time
    from TableA 
    where type = 'A'
    order by id, add_time ascending
    )
select typea
from aa
where aa.id = b.id
and b.month_end <= aa.add_tm
)
where exists
(
    with aa as
    (
    select id, nvl(old_value, new_value) typea, add_time
    from TableA 
    where type = 'A'
    order by id, add_time ascending
    )
select typea
from aa
where aa.id = b.id
and b.month_end <= aa.add_tm
)

Kudo提供示例輸入數據和所需的輸出。 我發現您的問題有些令人困惑,因此讓我改寫為“為表a中的與月底同月的值提供最后一個類型。

通過匹配輸入的類型和日期,我們可以獲得您的答案。 “ ROWNUM = 1”用於將結果集限制為單個條目,以防多行具有相同的add_time。 這種SQL仍然是一團糟,也許其他人可以提出更好的SQL。

UPDATE tableb b
   SET b.typea   =
           (SELECT old_value
              FROM tablea a
             WHERE     LAST_DAY( TRUNC( a.add_time ) ) = b.month_end
                   AND TYPE = 'A'
                   AND add_time =
                       (SELECT MAX( add_time )
                          FROM tablea
                         WHERE TYPE = 'A' AND LAST_DAY( TRUNC( a.add_time ) ) = b.month_end)
                   AND ROWNUM = 1)
 WHERE EXISTS
           (SELECT old_value
              FROM tablea a
             WHERE LAST_DAY( TRUNC( a.add_time ) ) = b.month_end AND TYPE = 'A');

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM