CREATE TABLE test_tab (
s_id NUMBER(10),
e_id NUMBER(10),
active_flg NUMBER(1)
);
INSERT INTO test_tab VALUES(1,11,1);
INSERT INTO test_tab VALUES(2,11,1);
INSERT INTO test_tab VALUES(3,11,0);
INSERT INTO test_tab VALUES(4,12,1);
INSERT INTO test_tab VALUES(5,12,1);
COMMIT;
Tool Used: SQL Developer(18c)
我想active_flg通過識別其中的值 0 來更新該列。假設,對于e_id11,我們有 3 行,所以首先它應該檢查對于e_id11 是否有任何 0 active_flg,如果該特定存在 0,e_id那么它應該將 11 的整個行更新e_id為 0。如果沒有條目,active_flg那么它不應該更新任何東西。
我的嘗試:
SET SERVEROUTPUT ON;
DECLARE
lv_row test_tab%ROWTYPE;
BEGIN
FOR i IN (SELECT * FROM test_tab)
LOOP
SELECT * INTO lv_row FROM test_tab WHERE e_id = i.e_id AND active_flg = 0;
UPDATE test_tab SET active_flg = 0 WHERE active_flg = 0;
END LOOP;
END;
但我沒有找到資料錯誤。
預期輸出:
------ ------ ------------
| s_id | e_id | active_flg |
------ ------ ------------
| 1 | 11 | 0 |
| 2 | 11 | 0 |
| 3 | 11 | 0 |
| 4 | 12 | 1 |
| 5 | 12 | 1 |
------ ------ ------------
uj5u.com熱心網友回復:
怎么樣merge(而不是 PL/SQL)?
前:
SQL> select * From test_tab order by s_id;
S_ID E_ID ACTIVE_FLG
---------- ---------- ----------
1 11 1
2 11 1
3 11 0
4 12 1
5 12 1
合并:
SQL> merge into test_tab a
2 using (select e_id from test_Tab
3 where active_flg = 0
4 ) b
5 on (a.e_id = b.e_id)
6 when matched then update set
7 a.active_flg = 0;
3 rows merged.
后:
SQL> select * From test_tab order by s_id;
S_ID E_ID ACTIVE_FLG
---------- ---------- ----------
1 11 0
2 11 0
3 11 0
4 12 1
5 12 1
SQL>
uj5u.com熱心網友回復:
一個(實用且快速)選項是使用分析函式假設active_flg有兩個值(僅0和1)
SQL> CREATE TABLE test_tab2 AS
SQL> SELECT t.s_id, t.e_id, MIN(t.active_flg) OVER (PARTITION BY t.e_id) AS active_flg
FROM test_tab t;
SQL> DROP TABLE test_tab;
SQL> ALTER TABLE test_tab2 RENAME TO test_tab;
但是如果表有索引,那么它們都應該重新創建;如果有權限授予其他用戶,他們也應該被重新授予。
uj5u.com熱心網友回復:
引發 no data found 的原因是該SELECT INTO子句沒有 i.e_id 的每個值的資料。一些記錄有 active_flg = 1,所以它會引發沒有找到該記錄的資料。
DECLARE
BEGIN
-- select DISTINCT so there is only 1 row per e_id.
-- add WHERE clause to only select e_id values that
-- have an active_flag = 0. since no action is to be take on the
-- others ignore those
FOR i IN (SELECT DISTINCT e_id FROM test_tab WHERE active_flag = 0)
LOOP
-- no need for the select into. The resultset of the cursor for loop
-- only contains the relevant records.
UPDATE test_tab SET active_flg = 0 WHERE e_id = i.e_id;
END LOOP;
END;
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/455873.html
下一篇:優化選擇聯合選擇oracle
