как обновить таблицу с наиболее частым значением - PullRequest
3 голосов
/ 09 августа 2011

У меня есть запрос на обновление, который должен обновить поле с наиболее частыми значениями из другой таблицы, вот как я делаю это в 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 неверный идентификатор)

Как я могу сделатьэто в оракуле?я хочу, чтобы T1.COLUMN_B заполнялось наиболее частым общим значением COLUMN_B ОТ T2 для каждого COLUMN_A.

Спасибо за любую помощь или предложение

Ответы [ 2 ]

2 голосов
/ 09 августа 2011

Это можно сделать в 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> 
2 голосов
/ 09 августа 2011

Я почти уверен, что есть гораздо менее сложный способ сделать это, но это должно быть хорошей отправной точкой и должно работать как в 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)
        )
    )
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...