【问题标题】:Insert Max Value of Column into Another Column将列的最大值插入另一列
【发布时间】:2009-08-13 03:55:27
【问题描述】:

我有一个由以下人员定义的表:

create table apple(

A number,

B number);

现在,我需要获取表中的值,如下所示:

A      B
------------------
1      4(max of A)
2      4(max of A)
3      4(max of A)
4      4(max of A)

如何插入这些行,使B 成为A 的最大值?

【问题讨论】:

    标签: sql oracle plsql


    【解决方案1】:

    Welp,首先你要在表中插入 1-4:

    insert into apple (a) values (1)
    insert into apple (a) values (2)
    insert into apple (a) values (3)
    insert into apple (a) values (4)
    

    接下来,您将要更新表以设置b

    update apple set b = (select max(a) from apple)
    

    如您所见,这是一个由两部分组成的过程。在创建该列之前,您无法获得a 的最大值!

    【讨论】:

    • +1 没错。这不是一个 INSERT 过程,而是一个发生在已插入表上的 UPDATE 过程:)
    【解决方案2】:

    当然,如果您希望使用 select 语句来获取其他字段,请使用 OVER 子句:

    SELECT a, MAX(a) OVER() as b
    FROM table;
    

    已编辑:

    对于现有的表,您可以这样做:

    UPDATE t SET b = maxcnt
    FROM (
        SELECT *, MAX(a) OVER() as maxcnt
        FROM table
       ) t;
    

    (我认为这在 Oracle 中有效......在 MS-SQL 中绝对没问题)

    罗伯

    【讨论】:

      【解决方案3】:

      从 11g 版本开始,您可以使用虚拟列(它们的值是实时计算的) 所以你应该改变你的列定义如下:

      create table apple (
      A number,
       B number GENERATED ALWAYS AS ( max(A) ) VIRTUAL 
      );
      

      我没有用于测试的 Oracle 11g,所以无法检查,但它应该可以工作。 您也可以为虚拟列使用用户定义的函数。

      有关更多示例和信息,请参阅http://www.oracle-base.com/articles/11g/VirtualColumns_11gR1.php

      在 11g 中创建表的官方文档: http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/statements_7002.htm

      【讨论】:

        猜你喜欢
        • 2015-01-18
        • 2020-12-03
        • 1970-01-01
        • 2018-08-25
        • 1970-01-01
        • 2020-05-20
        • 1970-01-01
        • 1970-01-01
        • 2021-05-11
        相关资源
        最近更新 更多