sql - 如何用最频繁的值更新表

标签 sql oracle

我有一个更新查询,它应该用另一个表中最频繁的值更新一个字段 这就是我在 postgreSQL 中的做法

UPDATE TABLE1 T1 
SET COLUMN_B = (SELECT COLUMN_B
                         FROM 
                         (SELECT COLUMN_A,COLUMN_B, COUNT(1) AS FREQUENCY
                                 FROM TABLE2 T2
                                GROUP BY COLUMN_A,COLUMN_B
                                 ORDER BY COLUMN_A,FREQUENCY DESC) QUERY1
                          WHERE QUERY1.COLUMN_A= T1.COLUMN_A

                    GROUP BY COLUMN_A,COLUMN_B,FREQUENCY
                    ORDER BY FREQUENCY DESC LIMIT 1
                   )

这在 postgresql 中运行良好,我想在 Oracle 中使用 rownum =1 执行相同的查询,但我有几个问题:

  1. 我不能在更新的选择中放入 ORDER BY
  2. 如果我决定在嵌套选择 (QUERY1) 中排序,则嵌套选择不理解对表 T1 的引用(T2.COLUMN_A = T1.COLUMN_A 给出一个错误T1.COLUMN_A 无效标识符)

我如何在 Oracle 中执行此操作?我想要的是 T1.COLUMN_B 为每个 COLUMN_A 填充 T2 中 COLUMN_B 的最常见公共(public)值。

感谢您的任何帮助或建议

最佳答案

这可以在 Oracle 中使用解析函数来完成;不知道相同的代码是否适用于 PostgreSQL。

创建目标表:

SQL> create table t23
  2    as select deptno, cast (null as number(7,2)) max_sal from dept
  3  /

Table created.
SQL> 

现在,更新:

SQL> update t23
  2  set max_sal = ( select sal from
  3                   ( select deptno, sal
  4                     , row_number() over (partition by deptno order by sal desc) rn
  5                      from emp )
  6                 where rn = 1
  7                 and deptno = t23.deptno )
  8  /

6 rows updated.

SQL>

结果如下:

SQL> select * from t23
  2  /

    DEPTNO    MAX_SAL
---------- ----------
        10       5000
        20       3000
        30       3750
        40
        50       4500
        60

6 rows selected.

SQL> 

只是为了确认结果...

SQL> select deptno, max(sal)
  2  from emp
  3  where sal is not null
  4  group by deptno
  5  order by deptno
  6  /

    DEPTNO   MAX(SAL)
---------- ----------
        10       5000
        20       3000
        30       3750
        50       4500

SQL> 

关于sql - 如何用最频繁的值更新表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6996968/

相关文章:

mysql - "id"的顺序在子查询中改变了吗?

sql - 进度数据库 4GL - 导出文件的数学计算

mysql支持 "with"这种sql吗?

sql - 搜索已包含通配符的 SQL 表?

oracle - 转换逗号分隔的 VARCHAR 以在 PL/SQL 的 IN 子句中使用?

mysql - 关于查询的格式

java - 从java调用oracle存储过程时在mybatis映射器中映射多个输出参数

java - tomcat oracle数据源

sql - 元编程oracle sql select语句

java - MySQL select 与 JDBC 的性能问题