我有一个场景,我必须更新所有行,但要更新许多行中的一个。
__________________________________________________________ |COlA | COLB | COLC | COLD | COLE | ----------------------------------------------------------- |Equipment SI | ADD INFO | MERGE | Notes | Y | |Equipment SI | Active | MERGE | Notes | Y | |Equipment SI | ORIGINAL | MERGE | Notes | Y | |Fastening | ADD INFO | MERGE | Notes | Y | |Fastening | Active | MERGE | Notes | Y | |Electonics | ADD INFO | MERGE | Notes | Y | |Electonics | Active O | MERGE | Notes | Y | |Electonics | ORIGINAL | MERGE | Notes | Y | |Electonics | Nominated| MERGE | Notes | Y | |Fiber | ADD INFO | MERGE | Notes | Y | |Fiber | ADD INFO | MULTI | Notes | Y | |Fiber | ADD INFO | KILO | Notes | Y |
现在我需要像
__________________________________________________________ |COlA | COLB | COLC | COLD | COLE | ----------------------------------------------------------- |Equipment SI | ADD INFO | MERGE | Notes | Y | |Equipment SI | Active | MERGE | Notes | N | |Equipment SI | ORIGINAL | MERGE | Notes | N | |Fastening | ADD INFO | MERGE | Notes | Y | |Fastening | Active | MERGE | Notes | N | |Electonics | ADD INFO | MERGE | Notes | Y | |Electonics | Active O | MERGE | Notes | N | |Electonics | ORIGINAL | MERGE | Notes | N | |Electonics | Nominated| MERGE | Notes | N | |Fiber | ADD INFO | MERGE | Notes | Y | |Fiber | ADD INFO | MULTI | Notes | Y | |Fiber | ADD INFO | KILO | Notes | Y |
我正在尝试将COLE‘Y’更新为’N’(除了一行)。COLA,COLD,COLE应该相同以更新该特定集合。如果任何行(COLA,COLC,COLD)组合只有一个’Y’,那么我不应该更新任何内容(示例数据中的光纤)。我必须更新整个表。有人可以帮我这个忙吗?我应该创建一个函数并遍历它吗?在那也如何只更新一行?
COLE
COLA,COLD,COLE
由于您在更新表时无需关心行的顺序,因此可以简单地使用 MIN 和 GROUP BY 。
更新 您需要按colA和分组colC。
colA
colC
例如,
设置
SQL> CREATE TABLE t 2 ( 3 COlA VARCHAR2(12), 4 COLB VARCHAR2(9), 5 COLC VARCHAR2(5), 6 COLD VARCHAR2(5), 7 COLE VARCHAR2(1) 8 ); Table created. SQL> INSERT ALL 2 INTO t (COlA, COLB, COLC, COLD, COLE) 3 VALUES ('Equipment SI', 'ADD INFO', 'MERGE', 'Notes', 'Y') 4 INTO t (COlA, COLB, COLC, COLD, COLE) 5 VALUES ('Equipment SI', 'Active', 'MERGE', 'Notes', 'Y') 6 INTO t (COlA, COLB, COLC, COLD, COLE) 7 VALUES ('Equipment SI', 'ORIGINAL', 'MERGE', 'Notes', 'Y') 8 INTO t (COlA, COLB, COLC, COLD, COLE) 9 VALUES ('Fastening', 'ADD INFO', 'MERGE', 'Notes', 'Y') 10 INTO t (COlA, COLB, COLC, COLD, COLE) 11 VALUES ('Fastening', 'Active', 'MERGE', 'Notes', 'Y') 12 INTO t (COlA, COLB, COLC, COLD, COLE) 13 VALUES ('Electonics', 'ADD INFO', 'MERGE', 'Notes', 'Y') 14 INTO t (COlA, COLB, COLC, COLD, COLE) 15 VALUES ('Electonics', 'Active O', 'MERGE', 'Notes', 'Y') 16 INTO t (COlA, COLB, COLC, COLD, COLE) 17 VALUES ('Electonics', 'ORIGINAL', 'MERGE', 'Notes', 'Y') 18 INTO t (COlA, COLB, COLC, COLD, COLE) 19 VALUES ('Electonics', 'Nominated', 'MERGE', 'Notes', 'Y') 20 INTO t (COlA, COLB, COLC, COLD, COLE) 21 VALUES ('Fiber', 'ADD INFO', 'MULTI', 'Notes', 'Y') 22 INTO t (COlA, COLB, COLC, COLD, COLE) 23 VALUES ('Fiber', 'ADD INFO', 'KILO', 'Notes', 'Y') 24 SELECT * FROM dual; 11 rows created. SQL> COMMIT; Commit complete.
表格数据
SQL> SELECT * FROM t; COLA COLB COLC COLD C ------------ --------- ----- ----- - Equipment SI ADD INFO MERGE Notes Y Equipment SI Active MERGE Notes Y Equipment SI ORIGINAL MERGE Notes Y Fastening ADD INFO MERGE Notes Y Fastening Active MERGE Notes Y Electonics ADD INFO MERGE Notes Y Electonics Active O MERGE Notes Y Electonics ORIGINAL MERGE Notes Y Electonics Nominated MERGE Notes Y Fiber ADD INFO MULTI Notes Y Fiber ADD INFO KILO Notes Y 11 rows selected.
更新声明
SQL> UPDATE t 2 SET colE = 'N' 3 WHERE ROWID NOT IN 4 ( SELECT MIN(rowid) FROM t GROUP BY colA, colC 5 ); 6 rows updated.
让我们 检查一下
SQL> SELECT * FROM t; COLA COLB COLC COLD C ------------ --------- ----- ----- - Equipment SI ADD INFO MERGE Notes Y Equipment SI Active MERGE Notes N Equipment SI ORIGINAL MERGE Notes N Fastening ADD INFO MERGE Notes Y Fastening Active MERGE Notes N Electonics ADD INFO MERGE Notes Y Electonics Active O MERGE Notes N Electonics ORIGINAL MERGE Notes N Electonics Nominated MERGE Notes N Fiber ADD INFO MULTI Notes Y Fiber ADD INFO KILO Notes Y 11 rows selected. SQL>