Oracle sql MERGE INTO с одним предложением where

У меня есть следующий код SQL (это то, что у меня есть до сих пор):

 MERGE INTO SCHEMA1.TABLE_1 table1 USING
    (
     SELECT DISTINCT table2.column1, 
            view1.column2
     FROM SCHEMA2.TABLE_2 table2
     LEFT JOIN SCHEMA2.VIEW_1 view1
     ON table2.column2 = view1.column3

    ) t2 ON (table1.column3 = t2.column1 )

    WHEN MATCHED THEN
      UPDATE
      SET table1.column4 = t2.column2;

Ниже приведено определение VIEW_1 :

    CREATE VIEW SCHEMA_2.VIEW_1
AS (SELECT 
SCHEMA_2.TABLE_1.COLUMN_1, 
SCHEMA_2.TABLE_2.COLUMN_1,
SCHEMA_2.TABLE_2.COLUMN_2,
SCHEMA_2.TABLE_2.COLUMN_3,
SCHEMA_2.TABLE_5.COLUMN_1, 
SCHEMA_2.TABLE_6.COLUMN_1, 
SCHEMA_2.TABLE_6.COLUMN_2,
SCHEMA_2.TABLE_6.COLUMN_3,
SCHEMA_2.TABLE_6.COLUMN_4, 
SCHEMA_2.TABLE_7.COLUMN_1, 
SCHEMA_2.TABLE_7.COLUMN_2, 
SCHEMA_2.TABLE_8.COLUMN_1 
FROM SCHEMA_2.TABLE_1
INNER JOIN SCHEMA_2.TABLE_2
ON SCHEMA_2.TABLE_1.COLUMN_1 = SCHEMA_2.TABLE_2.COLUMN_2 
INNER JOIN SCHEMA_2.TABLE_5
ON SCHEMA_2.TABLE_1.COLUMN_4 = SCHEMA_2.TABLE_5.COLUMN_3
LEFT OUTER JOIN SCHEMA_2.TABLE_6
ON SCHEMA_2.TABLE_2.COLUMN_2 = SCHEMA_2.TABLE_6.COLUMN_4
LEFT OUTER JOIN SCHEMA_2.TABLE_7
ON SCHEMA_2.TABLE_2.COLUMN_1 = SCHEMA_2.TABLE_8.COLUMN_5
);

Но я получаю следующее сообщение об ошибке:

Error report -
SQL Error: ORA-30926: unable to get a stable set of rows in the source tables
30926. 00000 -  "unable to get a stable set of rows in the source tables"
*Cause:    A stable set of rows could not be got because of large dml

Что вызывает ошибку? Что изменить в коде, чтобы он работал?

Спасибо за помощь!


person Community    schedule 19.06.2017    source источник
comment
Случайно ли представление view1 основано на table1?   -  person Tony Andrews    schedule 19.06.2017
comment
не могли бы вы опубликовать определение view_1   -  person Kacper    schedule 19.06.2017
comment
это представление, все таблицы которого находятся в schema2   -  person    schedule 19.06.2017
comment
Это в SCHEMA2 автоматически не означает, что не имеет ничего общего. Представление в SCHEMA2 может по-прежнему ссылаться на таблицы из SCHEMA1. Кроме того, доверие к вам очень низкое, поскольку вы задавали один и тот же вопрос три раза за последние 8 часов, и по крайней мере один раз вы ЯВНО использовали целевую таблицу в предложении USING.   -  person mathguy    schedule 19.06.2017
comment
да, я сделал, но я удалил из предложений все, что связано со схемой 1, и все равно не работало. . .   -  person    schedule 19.06.2017
comment
Чем меньше вы показываете, тем меньше шансов, что другие решат вашу проблему. Невозможно найти ошибку без всех частей. Пожалуйста, предоставьте код представления, и если представление использует другое представление, оно также необходимо и так далее.   -  person Kacper    schedule 19.06.2017
comment
@Kacper Пожалуйста, проверьте обновление   -  person    schedule 19.06.2017


Ответы (2)


По моему опыту, эта ошибка возвращается не только тогда, когда предложение USING возвращает более одной строки для строки в таблице MATCH, но и часто, когда нельзя быть уверенным в том, что будет возвращена только одна строка. (даже если нет реальных случаев возврата нескольких строк). Чтобы заставить синтаксический анализатор принять запрос в подобных случаях, я обычно прибегаю к использованию GROUP BY в столбцах MATCH..ON.

MERGE INTO SCHEMA1.TABLE_1 table1 USING
(
 SELECT table2.column1, 
        MAX(view1.column2) as column2
 FROM SCHEMA2.TABLE_2 table2
 LEFT JOIN SCHEMA2.VIEW_1 view1
 ON table2.column2 = view1.column3
 GROUP BY table2.column1
) t2 ON (table1.column3 = t2.column1 )

WHEN MATCHED THEN
  UPDATE
  SET table1.column4 = t2.column2;
person RBarryYoung    schedule 19.06.2017
comment
[ПЛЮС ОДИН] Отлично! Это помогло, спасло мне жизнь! - person ; 19.06.2017
comment
Подавление ORA-30926 — это не то же самое, что заставить запрос работать. Почему max(view1.column2) должен быть правильным ответом, а не min(view1.column2)? - person APC; 19.06.2017
comment
@APC, это хороший момент, если на самом деле возвращается несколько значений, тогда OP необходимо будет определить, какое из них является правильным для применения. Моя точка зрения заключалась в том, что эта ошибка может (и происходит) возникать, даже если на самом деле не возвращаются дубликаты, если во время выполнения Oracle не может быть уверен в том, что только одно значение для каждой целевой строки будет быть возвращены. В этом случае использование MAX()..GROUP BY.. обеспечивает успешный способ подавления этой ложной ошибки. - person RBarryYoung; 19.06.2017

В этом примере ваша проблема определенно связана с подзапросом USING. Этот запрос выдает более одного значения table2.column1:

SELECT DISTINCT table2.column1, 
        view1.column2
 FROM SCHEMA2.TABLE_2 table2
 LEFT JOIN SCHEMA2.VIEW_1 view1
 ON table2.column2 = view1.column3

Таким образом, предложение ON будет соответствовать одной и той же строке (строкам) в table1 более одного раза:

ON (table1.column3 = t2.column1 )

Oracle не может понять, какое значение t2.column2 следует использовать в UPDATE, поэтому выбрасывает ORA-30926.

Использование Different в подзапросе не помогает, потому что это дает перестановки всех столбцов. Вам нужно написать подзапрос, который будет создавать уникальные значения t2.column1 во всех строках, или добавить еще один идентифицирующий столбец (столбцы), чтобы сгенерировать уникальный ключ, который вы можете соединить с table1.

person APC    schedule 19.06.2017