我有一个更新查询,它应该用另一个表中最频繁的值更新一个字段 这就是我在 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 执行相同的查询,但我有几个问题:
- 我不能在更新的选择中放入 ORDER BY
- 如果我决定在嵌套选择 (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/