Sql 如何在满足给定条件的多行中更新除一行以外的所有行?
我有一个场景,我必须更新所有的行,但许多行中只有一行Sql 如何在满足给定条件的多行中更新除一行以外的所有行?,sql,oracle,oracle11g,sql-update,Sql,Oracle,Oracle11g,Sql Update,我有一个场景,我必须更新所有的行,但许多行中只有一行 __________________________________________________________ |COlA | COLB | COLC | COLD | COLE | ----------------------------------------------------------- |Equipment SI | ADD INFO | MERGE | Notes |
__________________________________________________________
|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更新为“N”,除了“Y”中的一行。COLA,COLD,COLE应该是相同的,以更新特定的集合。如果任何rowCOLA、COLC、ColdComposition只有一个“Y”,那么我不应该更新示例数据中的任何内容。我必须更新整个表。有人能帮我吗。我应该创建一个函数并循环它吗?在这种情况下,如何只更新一行?更新表\u名称
set colE='N'
rowid不在哪里
选择minrowid
从表\u名称
可乐集团
因为在更新表时不关心行的顺序,所以可以简单地使用MIN和groupby 更新您需要按可乐和可乐分组 比如说, 设置 表数据 更新语句 让我们检查一下
如果你真的不在乎哪一行没有被更新,那么我可能会有一个选择MAXall列的subselect,而我的outer select在sub select中会有一个not。我没有把这个作为答案,因为我没有时间写代码,但希望这会给你一个答案,是的,我不在乎哪一行被更新。我只想更新该集中的一个值。好的,谢谢你。我试试看。但是如果你有时间,请试着发布答案。@Crazy2crack我看到你有COLE='Y'只用于colb='ADD INFO'。如果是这种情况,那么只需将这些行更新为“N”,其中colb“添加信息”。嗨,Lalit,对不起。举个例子,我已经给出了这些场景。这只适用于少数行,但并非所有行都适用。我在该特定表中有大约5000行。这将更新所有其他行。就像我和科尔只有一个条目的值是“Y”。我不需要更新与该行对应的任何内容。但这也将其更新为“N”。例如,我的问题中的“纤维”在这个场景中,最后一排纤维对我来说也是“N”。我在哪里犯了什么错误吗?@Crazy2crack只有一根光纤,是Y。@Crazy2crack你确定你的桌子上只有一排光纤吗?做一件事,加一份可乐订单,然后再检查一遍。我真的很兴奋。我还有一个问题。COLC可能会有所不同。这不是常数。更新了我的问题。不礼貌的Sry:@Crazy2crack没问题,只需将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>