Удалить строки, возвращенные из оператора Select, который содержит предложение наличия и группировки в Oracle

У меня есть этот оператор выбора:

SELECT d.idcprefix,
         d.orgdept,
         d.idcseq,
         d.subcont, 
         d.actualcomp, 
         COUNT (*) AS "No Duplicates"
    FROM DCS_IDC, DCS_IDC z
   WHERE     D.IDCPREFIX = z.idcprefix
         AND z.orgdept = d.orgdept
         AND z.idcseq = d.idcseq
         and D.SUBCONT is not null
  HAVING COUNT (*) > 1
GROUP BY d.idcprefix,
         d.orgdept,
         d.idcseq,
         d.subcont,
         d.actualcomp
ORDER BY d.idcprefix,
         d.orgdept,
         d.idcseq,
         d.subcont,
         d.actualcomp

и я хочу удалить строки, возвращенные из этого заявления, есть идеи?

Команда Delete FROM дает мне ошибку ORA-01732: data manipulation operation not legal on this view, потому что, как мне кажется, я сравниваю две таблицы, хотя и одну и ту же.

Я также попытался удалить из tablename, где существуют строки, но при этом было удалено гораздо больше строк, чем мне хотелось.

«Дубликаты» основаны на Subcont. Были записи, вставленные в базу данных/приложение с использованием поля subcont, которое должно было быть пустым, поэтому теперь у меня есть записи, которые одинаковы, за исключением одной, например, A в subcont и пустой в другой:

idcprefix, subcont, orgdept and idcseq
1          A        ABC         1
1                   ABC         1
2          A        BCD         1
2                   BCD         1

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

Помощь будет высоко оценена!


person iandavidson1982    schedule 24.07.2013    source источник
comment
Правильно ли я понимаю, что этот запрос находит дубликаты в DCS_IDC, и вы хотите удалить все дубликаты, кроме одного? Есть ли в этой таблице первичный ключ? Вас волнует, какой из дубликатов останется?   -  person Bob Jarvis - Reinstate Monica    schedule 24.07.2013
comment
Привет, в этой таблице не используется первичный ключ. В таблице используется уникальный тип ключа, соответствующий idcprefix, subcont, orgdept и idcseq. Я добавил немного выше для контекста   -  person iandavidson1982    schedule 24.07.2013


Ответы (2)


Предполагая, что (idcprefix, subcont, orgdept, idcseq) уникален, как насчет следующего?

DELETE FROM DCS_IDC
WHERE (idcprefix, subcont, orgdept, idcseq) IN (
  WITH del AS (
  SELECT d.idcprefix,
     d.orgdept,
     d.idcseq,
     d.subcont, 
     d.actualcomp, 
     COUNT (*) AS "No Duplicates"
  FROM DCS_IDC, DCS_IDC z
  WHERE     D.IDCPREFIX = z.idcprefix
     AND z.orgdept = d.orgdept
     AND z.idcseq = d.idcseq
     and D.SUBCONT is not null
  HAVING COUNT (*) > 1
  GROUP BY d.idcprefix,
     d.orgdept,
     d.idcseq,
     d.subcont,
     d.actualcomp
  ORDER BY d.idcprefix,
     d.orgdept,
     d.idcseq,
     d.subcont,
     d.actualcomp
  )
 SELECT idcprefix, subcont, orgdept, idcseq FROM del
)
person Yiannis Nennes    schedule 24.07.2013
comment
Привет, в этой таблице не используется первичный ключ. В таблице используется уникальный тип ключа, соответствующий idcprefix, subcont, orgdept и idcseq. - person iandavidson1982; 24.07.2013
comment
Спасибо Loannis, это сработало! (Вы пропустили D после первого DCS_IDC в ​​операторе FROM, который я добавил, и после этого он отлично работал!) - person iandavidson1982; 24.07.2013

Как насчет:

BEGIN
  FOR aRow IN (SELECT d.idcprefix,
                      d.orgdept,
                      d.idcseq,
                      COUNT(*) AS DUP_COUNT
                 FROM DCS_IDC d
                 HAVING COUNT(*) > 1
                 GROUP BY d.idcprefix,
                          d.orgdept,
                          d.idcseq)
  LOOP
    DELETE FROM DCS_IDC
      WHERE IDCPREFIX = aRow.IDCPREFIX AND
            ORGDEPT = aRow.ORGDEPT AND
            IDCSEQ = aRow.IDCSEQ AND
            SUBCONT IS NOT NULL;
  END LOOP;
END;

Никаких гарантий. Используйте на свой риск. Не тестируется на животных - будете первыми!

Делитесь и наслаждайтесь.

person Bob Jarvis - Reinstate Monica    schedule 24.07.2013
comment
Спасибо, Боб, я попробовал, но получил ключевое слово FROM, не найденное там, где ожидалась ошибка. Я дал Лоаннису ответ, и он удалил необходимые поля. - person iandavidson1982; 24.07.2013
comment
После d.idcseq в SELECT отсутствовала запятая. Исправлено сейчас, для чего это стоит. - person Bob Jarvis - Reinstate Monica; 24.07.2013