Delete merge oracle: BASE — MERGE Statement Enhancements in Oracle Database 10g
Сообщение об ошибке 8672 — оператор MERGE пытался обновить или удалить одну и ту же строку более одного раза
12 марта 2017 г., 20:30:13
Пинал Дэйв
Хотя я давно веду блог о SQL Server, я все еще считаю, что есть еще много ошибок, которые я не обнаружил. Всегда интересно увидеть новую ошибку и найти решение проблемы. Давайте посмотрим, как исправить ошибку, связанную с оператором MERGE.
Вот одна из ошибок, с которыми я столкнулся при подготовке к демонстрации.
Сообщение 8672, уровень 16, состояние 1, строка 19
Оператор MERGE попытался выполнить ОБНОВЛЕНИЕ или УДАЛЕНИЕ одной и той же строки более одного раза. Это происходит, когда целевая строка соответствует более чем одной исходной строке. Оператор MERGE не может ОБНОВИТЬ/УДАЛИТЬ одну и ту же строку целевой таблицы несколько раз. Уточните предложение ON, чтобы целевая строка соответствовала не более чем одной исходной строке, или используйте предложение GROUP BY, чтобы сгруппировать исходные строки.
Пока сообщение об ошибке сообщало мне о проблеме, я хотел узнать, как ее избежать. Вот пример кода, который любой может использовать и воспроизвести ту же ошибку.
SET NOCOUNT ON
GO
USE tempdb
GO
CREATE TABLE Employee(EmpID INTEGER,EmpName VARCHAR(15))
GO
INSERT INTO Employee VALUES(1,'Pinal')
INS ERT INTO Employee VALUES(2,'SQLServer ')
INSERT INTO Employee VALUES(1,'SQLAuthority')
GO
CREATE TABLE EmployeeSalary (EmpID INTEGER ,Salary INTEGER)
GO
INSERT INTO EmployeeSalary VALUES(1,235)
INSERT INTO EmployeeSalary VALUES(2,255)
GO
MERGE EmployeeSalary AS es
USING (SELECT EmpID,EmpName FROM Employee) AS m
ON es.EmpID = m. EmpID
КОГДА СООТВЕТСТВУЕТ ТО
обновление SET es.Salary = es.Salary + 25;
Глядя на сообщение об ошибке, становится ясно, что оператор слияния пытается обновить целевую таблицу «Оклад сотрудников», но при этом SQL-сервер обнаружил повторяющуюся запись в исходной таблице (определяемой как запрос)
Следовательно, здесь, в таблице Employee, которая является исходной таблицей в операторе слияния, есть две похожие записи для EmpID (1) . Это пытается обновить целевую таблицу Employee Salary, которая имеет одну уникальную запись для этого EmpID. Следовательно, эта операция не разрешена в слиянии, и она выдает указанную выше ошибку, когда в исходной таблице наблюдается повторяющаяся запись (ссылка на столбец в предложении ON в слиянии).
Чтобы решить эту проблему, нам необходимо удалить повторяющиеся данные из исходных объектов или предотвратить возникновение таких ошибок. Мы также можем создать ограничения первичного ключа для полей, указанных в предложении ON оператора слияния.
Ссылка: Pinal Dave (http://blog.SQLAuthority.com)
Теги:
SQL-сервер
Автор: Пинал Дэйв
Пинал Дэйв — специалист по технологиям Microsoft (база данных и бизнес-аналитика). Он написал более 1700 статей на эту тему в своем блоге по адресу http://blog.sqlauthority.com. Он динамичный и опытный главный архитектор базы данных, специализирующийся на настройке производительности SQL Server и имеющий более 7 лет практического опыта. Он имеет степень магистра наук и ряд сертификатов, включая MCTS, MCDBA и MCAD (.NET). Он также является региональным наставником PASS Asia. До прихода в Microsoft он был награжден наградой Microsoft MVP в течение трех лет подряд за свой вклад в сообщество.
Вопрос: ВЫБЕРИТЕ ОТЛИЧНЫЙ A.CUSTOMER_REF, PLAN_TABLE_OUTPUT Как удалить соединение слиянием Ответ: — Забыли добавить условие объединения таблиц в предложение WHERE У тебя Подсказка ORDERED для принудительного выбора оптимального порядка соединения. Что касается декартового соединения слиянием, сначала внимательно проверьте ГДЕ Дополнительная информация об отключении декартовых объединений слиянием, если ЗДЕСЬ.
|