簡體   English   中英

Oracle:從自我聯接更新

[英]Oracle: Updating from self-join

給定此表:

MODEL   RESULT  DATE    SECTION
AABBCC  10.5    1/1/2001    1
AABBCC  15.6    1/1/2001    2
AABBCC  42.2    1/1/2001    3
AABBCC  35.4    1/1/2001    4
AABBCC  82.1    1/1/2001    5
AABBCC  95.3    1/1/2001    6
AABBCC  76.5    1/1/2001    7

我要確保對於每個部分(對於相同的日期/模型),結果始終大於或等於任何前面的部分。

例如,如果第7行的結果小於第6行的結果,則我需要將第7行設置為等於第6行的結果。

同樣,如果第5行的結果小於第2行的結果,則需要將第5行的結果設置為第2行的結果。

我可以使用如下自連接找到較高部分的值比前一個部分低的情況:

SELECT 
  t1.MODEL as MODEL,
  t1.DATE as DATE
  t1.RESULT as RESULT_1,
  t1.SECTION as SECTION_1,
  t2.RESULT as RESULT_2,
  t2.SECTION as SECTION_2
FROM table t1
INNER JOIN table t2
ON t1.DATE = t2.DATE AND t1.MODEL = t2.MODEL
WHERE t2.section > t1.section AND
      t2.result < t1.result 

產生以下內容:

MODEL   DATE    SECTION_1   RESULT_1    SECTION_2   RESULT_2
AABBCC  1/1/2001    3   42.2    4   35.4
AABBCC  1/1/2001    6   95.3    7   76.5

我試圖像這樣合並數據:

MERGE INTO table new
USING (

SELECT 
  t1.MODEL as MODEL,
  t1.DATE as DATE
  t1.RESULT as RESULT_1,
  t1.SECTION as SECTION_1,
  t2.RESULT as RESULT_2,
  t2.SECTION as SECTION_2
FROM table t1
INNER JOIN table t2
ON t1.DATE = t2.DATE AND t1.MODEL = t2.MODEL
WHERE t2.section > t1.section AND
      t2.result < t1.result 
) old

ON (new.DATE = old.DATE AND new.section > old.section)
WHEN MATCHED THEN
UPDATE
SET new.result = old.result;

但我收到以下錯誤:

錯誤報告-SQL錯誤:ORA-30926:無法在源表30926中獲得穩定的行集。00000-“無法在源表中獲得穩定的行集” *原因:無法獲得穩定的行集由於dml活動較大或不確定的where子句而被獲取。 *操作:刪除所有不確定的where子句,然后重新發出dml。

MERGE INTO table new
USING (
SELECT  MODEL,
        DATE,
        RESULT,
        SECTION
FROM (
SELECT 
  t1.MODEL as MODEL,
  t1.DATE as DATE,
  MAX(t1.RESULT) OVER (PARTITION BY t1.MODEL ORDER BY t1.SECTION) as RESULT,
  t1.SECTION as SECTION,
  t1.RESULT as OLD_RESULT
FROM table t1)
WHERE OLD_RESULT != RESULT
) old
ON (new.DATE = old.DATE AND new.section = old.section and new.MODEL = old.MODEL )
WHEN MATCHED THEN
UPDATE
SET new.result = old.result;

暫無
暫無

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

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