Sql 如何使用最频繁的值更新表

Sql 如何使用最频繁的值更新表,sql,oracle,Sql,Oracle,我有一个更新查询,它应该使用另一个表中最频繁的值更新字段 我在postgreSQL中就是这样做的 UPDATE TABLE1 T1 SET COLUMN_B = (SELECT COLUMN_B FROM (SELECT COLUMN_A,COLUMN_B, COUNT(1) AS FREQUENCY FROM TABLE2 T

我有一个更新查询,它应该使用另一个表中最频繁的值更新字段 我在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执行相同的查询,但我有几个问题:

我不能在更新的选择范围内下订单 如果我决定在嵌套的select查询1中输入order by,则嵌套的select不理解对表T1 T2.COLUMN_A=T1.COLUMN_A的引用,因为T1.COLUMN_是无效标识符 在oracle中如何执行此操作?我想要的是T1.COLUMN_B填充T2中每个COLUMN_A最常用的COLUMN_B值


感谢您的帮助或建议

我很确定有一些简单得多的方法可以做到这一点,但这应该是一个很好的起点,应该在Oracle和Postgres中都能起作用

UPDATE TABLE1 T1
SET COLUMN_B = 
select COLUMN_B from (
(SELECT DISTINCT COLUMN_A, COLUMN_B
    FROM TABLE2 T2
    WHERE T2.COLUMN_A= T1.COLUMN_A
    GROUP BY COLUMN_A, COLUMN_B
    HAVING COUNT(1) = (
        SELECT MAX(CNT) FROM (
            SELECT COLUMN_B, COUNT(1) AS CNT
            FROM TABLE2 T3
            WHERE T3.COLUMN_A= T2.COLUMN_A)
        )
    )
)

这可以在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> 

感谢您提供的解决方案,但它仍然给我一个错误,即T1.COLUMN_是来自上一个嵌套select的无效标识符,其中T3.COLUMN_A=T1.COLUMN_A。您似乎无法从嵌套select中引用要更新的表,并且如果没有嵌套select,我无法找到频率。这很奇怪。根据文档,这是一个有效的更新:update employee_temp SET first_name,last_name=从employee_id=employee_temp.employee_id文档中选择first_name,last_name,但是如果select包含嵌套的select,子查询就不能引用employee_temp。这是我在测试中发现的。也许你只能引用一个级别以上。我编辑了答案,请再试一次,因为目前我没有访问Oracle db的权限。同样的问题,我认为你是对的,你只能参考一个级别,更新不是问题。+1对于分区上的行数,由deptno order由sal desc确定,这是针对order by LIMITIONS的更好解决方法