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>