Oracle SQL - удаление записей на основе уникальных строк - PullRequest
0 голосов
/ 25 апреля 2018

Я вытягиваю один столбец из БД, и это выглядит примерно так:

Group
A
A
A
B
B
B
C
D
D
D
E
F
F
F

Мне нужно удалить уникальные записи, поэтому записи A, B, D и F должны остаться, а записи C и E. должны быть удалены.

Я получаю эту строку на основе запроса, подобного этому:

select Group from table where type = 'rec';

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

ПРИМЕЧАНИЕ: мне нужно, чтобы это было автоматизировано, а не просто «удалить C» и «удалить E», потому что есть тысячи строк, и я не уверен, что мне нужно будет удалить, если я просто не найду их. Количество строк, которые нужно будет удалить, также будет меняться, поэтому мне нужно, чтобы оно было автоматизировано на основе подсчета.

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Один метод:

delete t
    where "group" in (select "group" from t group by "group" having count(*) = 1);

На основе вашего образца кода:

delete t
    where type = 'rec' and
          "group" in (select "group" from t where type = 'rec' group by "group" having count(*) = 1);

Вы также можете сделать это как:

delete t
    where type = 'rec' and
          not exists (select 1
                      from t t2
                      where t2.group = t.group and t2.type = 'rec' and t2.rowid <> t.rowid
                     );
0 голосов
/ 25 апреля 2018

Судя по вашим комментариям, все, что вам нужно, это промежуточный итог.Если запись произошла один раз, выберите / удалите ее.Аналитические функции - лучший и самый простой способ, если вы спросите меня:

SELECT * FROM 
(
 SELECT COUNT(grp) OVER (PARTITION BY grp ORDER BY grp) cnt -- number of occurances --
       , grp 
   FROM
   ( -- convert to multi-row - REPLACE AAABBB with your actual column --
    SELECT trim(regexp_substr('A A A B B B C D D D E F F F', '[^ ]+', 1, LEVEL)) grp
      FROM dual -- from your table_name --
    CONNECT BY LEVEL <= regexp_count('A A A B B B C D D D E F F F', '[^ ]+')
   )
  )
 WHERE cnt = 1 -- Select/Delete only those that appeared once -- 
 /

Вывод:

cnt|grp
--------
1   C
1   E

Полный вывод, если вы прокомментируете где:

cnt|grp
--------
3   A
3   A
3   A
3   B
3   B
3   B
1   C
3   D
3   D
3   D
1   E
3   F
3   F
3   F

Окончательное редактирование на основе ваших вопросов.Это имитирует вашу таблицу:

WITH your_table AS
(
 SELECT 'rec' grp_type FROM dual
 UNION ALL
 SELECT 'not_rec' grp_type FROM dual
 )
 SELECT grp_type FROM your_table WHERE grp_type = 'rec' -- apply all that above to this select --
 /
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...