Логика удаления дублирующихся данных выбрасывает ORA-00913: слишком много значений

#oracle #oracle11g #sql-delete #ora-00913

#Oracle #oracle11g #sql-delete #ora-00913

Вопрос:

Я пытаюсь выполнить удаление таблицы, содержащей повторяющиеся значения, используя приведенную ниже логику SQL, но oracle выдает ошибку ORA-00913: слишком много значений при выполнении.

 DELETE
FROM
  UT_USER
WHERE
  ROWID NOT IN
  (
    SELECT
      MAX(ROWID),
      USER_NAME,
      MODULE,
      EFF_BEGIN_DT,
      EFF_END_DT,
      STATUS,
      EDW_CREATE_DATE_TIME,
      EDW_UPDATE_DATE_TIME,
      EDW_CREATED_BY,
      EDW_UPDATED_BY,
      EDW_UPDATE_NOTE
    FROM
      UT_USER
    GROUP BY
      USER_NAME,
      MODULE,
      EFF_BEGIN_DT,
      EFF_END_DT,
      STATUS,
      EDW_CREATE_DATE_TIME,
      EDW_UPDATE_DATE_TIME,
      EDW_CREATED_BY,
      EDW_UPDATED_BY,
      EDW_UPDATE_NOTE
  ) ;
 

Ответ №1:

SELECT Оператор в вашем NOT IN возвращает несколько столбцов. Он должен возвращать ровно один столбец, чтобы быть действительным (отсюда и ошибка). К счастью, похоже, что вы можете просто исключить дополнительные столбцы, которые вы выбираете

 DELETE
FROM
  UT_USER
WHERE
  ROWID NOT IN
  (
    SELECT
      MAX(ROWID)
    FROM
      UT_USER
    GROUP BY
      USER_NAME,
      MODULE,
      EFF_BEGIN_DT,
      EFF_END_DT,
      STATUS,
      EDW_CREATE_DATE_TIME,
      EDW_UPDATE_DATE_TIME,
      EDW_CREATED_BY,
      EDW_UPDATED_BY,
      EDW_UPDATE_NOTE
  ) ;
 

Комментарии:

1. Спасибо, приведенная выше логика сработала. Сначала я думал, что количество столбцов, используемых во внутреннем запросе, должно совпадать с внешним запросом.