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
Используйте любую функцию, которая вам подходит.