利用rowid完成自連接的表更新

開發人員反饋有一條業務SQL很難實現,具體要實現如下功能:

表數據如下圖,用name字段去更新fl字段,得到結果如右圖所示:

   =======>   

DROP TABLE TEST_W;
create table test_W (ID NUMBER,NAME CHAR(1),FL CHAR(1));
INSERT INTO test_W VALUES(1,'A','');
INSERT INTO test_W VALUES(1,'B','');
INSERT INTO test_W VALUES(1,'C','');
INSERT INTO test_W VALUES(1,'D','');
INSERT INTO test_W VALUES(2,'E','');
INSERT INTO test_W VALUES(2,'F','');
INSERT INTO test_W VALUES(2,'G','');
INSERT INTO test_W VALUES(2,'H','');
INSERT INTO test_W VALUES(2,'I','');
INSERT INTO test_W VALUES(2,'J','');
INSERT INTO test_W VALUES(2,'K','');
INSERT INTO test_W VALUES(2,'L','');
INSERT INTO test_W VALUES(2,'M','');
INSERT INTO test_W VALUES(2,'N','');
INSERT INTO test_W VALUES(2,'O','');
COMMIT;

思路:使用select填充FL列  在使用rowid自關聯更新

SELECT ID, RID, MIN(NAME) over(PARTITION BY id, nn ORDER BY NAME) AS NAME2
  FROM (SELECT a.*, ceil(num1 / 3) nn
          FROM (SELECT id,
                       NAME,
                       fl,
                       ROWID AS rid,
                       row_number() over(PARTITION BY id ORDER BY rowid) AS num1
                  FROM test_w) a) aa;

利用rowid匹配對原表進行更新

MERGE INTO TEST_W A
USING (SELECT ID,
       RID,
       MIN(NAME) over(PARTITION BY id, nn ORDER BY NAME) AS NAME2
  FROM (SELECT a.*, ceil(num1 / 3) nn
          FROM (SELECT id,
                       NAME,
                       fl,
                       ROWID AS rid,
                       row_number() over(PARTITION BY id ORDER BY rowid) AS num1,
                       COUNT(1) over(PARTITION BY id) AS num2
                  FROM test_w) a) aa) BB
ON (A.ID = BB.ID AND A.ROWID = BB.RID)
WHEN MATCHED THEN
  UPDATE SET FL = BB.NAME2;

 

發佈了47 篇原創文章 · 獲贊 9 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章