Обновите несколько строк в целевой таблице из одной строки в исходной таблице, используя естественный ключ - PullRequest
0 голосов
/ 21 мая 2019

Мне нужно обновить два столбца в таблице FACT, используя данные из таблицы измерений.проблема в том, что у меня нет первичного ключа, который соответствует обеим таблицам, поэтому я должен использовать естественный ключ, два столбца, чтобы создать уникальное значение.кроме того, у источника есть одна запись, а у цели - несколько записей.если я выполняю слияние, я получаю

ora-30926, неспособный получить стабильный набор строк

, и если я делаю обновление, я получаю другую ошибку.пожалуйста, мне нужна помощь.

Я пробую это заявление об обновлении:

UPDATE dw.target_table obc
SET
( obc.sail_key,
  obc.durations ) = (
    SELECT 
        sd.sail_key,
        sd.durations
    FROM
        dw.source_table sd
    WHERE
        obc.code_1 = sd.code_2
        AND obc.date_1 = sd.date_2
)
WHERE
obc.item NOT IN (
    30,
    40
)
AND obc.sail_key = 0
and OBC.load_date between to_date('01-12-2018','DD-MM-YYYY') 
AND  to_date ('31-12-2018','DD-MM-YYYY');

, и я пробую это утверждение слияния:

   MERGE INTO dw.target_table obc 
  USING ( SELECT distinct
                  code_2,date_2,durations,sail_key
          FROM dw.source_table
   ) tb_dim 
  ON ( obc.code_1 = tb_dim.code_2
  AND obc.date_1 = tb_dim.date_2 )
    WHEN MATCHED THEN UPDATE SET obc.durations = tb_dim.durations,
  obc.sail_key = tb_dim.sail_key
 WHERE
obc.sail_key = 0
AND obc. NOT IN (
    30,
    40
)
AND obc.loaddate BETWEEN TO_DATE('01-01-2012','DD-MM-YYYY') 
AND TO_DATE  ('31-01-2012','DD-MM-YYYY');

1 Ответ

1 голос
/ 21 мая 2019

ora-30926 не может получить стабильный набор строк

Это означает, что (code_2,date_2) является , а не уникальным ключом tb_dim.Следовательно, ваш подзапрос USING не создает набор, который соответствует только одной строке любой строке в obc.Следовательно, MERGE завершается ошибкой, поскольку Oracle не может определить, какую строку из подзапроса USING следует применить к цели.DISTINCT не помогает, потому что он применяется ко всей проекции, и кажется, что у вас есть несколько различных значений durations,sail_key для каждой перестановки code_2,date_2.

Вы не говорите, какую ошибку вы получаете, когда вызапустите ОБНОВЛЕНИЕ, но предположительно это ORA-01779 или ORA-01427.Что-то, указывающее на то, что подзапрос не возвращает набор ключей соединения.

Так как вы исправите ситуацию?Мы не можем дать вам правильное решение, потому что это ошибка вашей модели данных или вашей спецификации.Решение требует понимания вашего бизнеса, которого у нас нет.Но обычно вам нужно найти дополнительное правило, которое сводит подзапрос USING к набору.То есть:

  • добавить третий ключевой столбец, который позволяет предложению ON отображать одну строку в tb_dim в одну строку в obc;или
  • использовать аналитическую функцию row_number() в подзапросе, чтобы подделать такой столбец, предпочтительно упорядочение по значимому столбцу, такому как дата;или
  • добавьте условие WHERE в подзапросе для удаления дублирующихся значений code_2,date_2.

В качестве альтернативы, если вам все равно, какие конкретные значения durations,sail_key применяютсяВы можете использовать агрегат:

USING (SELECT code_2
              ,date_2
              ,max(durations) as durations
              ,max(sail_key) as sail_key
       FROM dw.source_table
       group by code_2,date_2 ) tb_dim

Используйте любую функцию, которая вам подходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...