Sql 如何使用最频繁的值更新表
我有一个更新查询,它应该使用另一个表中最频繁的值更新字段 我在postgreSQL中就是这样做的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
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的更好解决方法