2013-07-24 3 views
0

У меня есть этот оператор выбора:Удалять Ряды привезли из Выбери заявление, которое содержит имеющую и группу по статье в 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 

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

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

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

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

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

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

Помощь была бы очень признательна!

+1

Я правильно понимаю, что этот запрос находит дубликаты в DCS_IDC, и вы хотите удалить все, кроме одного из дубликатов? Есть ли первичный ключ в этой таблице? Вам не нравится, какой из дубликатов сохраняется? –

+0

Привет, в этой таблице нет первичного ключа. В таблице используется уникальное ограничение типа ключа на idcprefix, subcont, orgdept и idcseq. Я добавил немного выше для контекста – iandavidson1982

ответ

0

Предполагая, что (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 
) 
+0

Привет, в этой таблице нет первичного ключа. В таблице используется уникальное ограничение типа ключа на idcprefix, subcont, orgdept и idcseq. – iandavidson1982

+0

Обновлен запрос, это сработает для вас? –

+1

Спасибо Loannis, что сработало удовольствие! (Вам не хватало D после первого DCS_IDC в ​​инструкции FROM, который я добавил, и после этого он отлично сработал!) – iandavidson1982

0

Как насчет:

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; 

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

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

+0

Спасибо, Боб, я попробовал попробовать, но получал ключевое слово FROM, где не было ожидаемой ошибки. Я дал Лоаннису ответ на завихрение и удалил необходимые поля. – iandavidson1982

+0

Отсутствие запятой после 'd.idcseq' в SELECT. Исправлено сейчас, для чего это стоит. –