開發人員反饋有一條業務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;