Как найти повторяющиеся значения в таблице в Oracle?

Какой самый простой оператор SQL вернет повторяющиеся значения для данного столбца и количество их вхождений в таблицу базы данных Oracle?

Например: у меня есть таблица JOBS со столбцом JOB_NUMBER. Как я могу узнать, есть ли у меня дубликаты JOB_NUMBER и сколько раз они дублировались?

другие решения stackoverflow.com/questions/4522431/…

zloctb 19.08.2015 08:56
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
288
1
736 737
13
Перейти к ответу Данный вопрос помечен как решенный

Ответы 13

Ответ принят как подходящий

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

SELECT column_name, COUNT(column_name)
FROM table_name
GROUP BY column_name
HAVING COUNT(column_name) > 1;

Спасибо - это ответ, который я только что нашел, и вы превзошли меня, разместив его здесь! : o)

Andrew 12.09.2008 19:19

Пожалуйста. Теперь я собираюсь опубликовать свой вопрос о различиях между count (столбец) и count (*). :)

Bill the Lizard 12.09.2008 19:23

+1 через 4 года, по-прежнему работает хорошо, и его можно настроить для выбора нескольких столбцов, если они также есть в group by, например: select column_one, column_two, count(*) from tablename group by column_one, column_two having count(column_one) > 1; и т. д.

Amos M. Carpenter 24.09.2012 06:19

или даже having count(*) > 1: D

Stanislav Mamontov 23.03.2015 11:43

+1 более 8 лет спустя, по-прежнему хорошо работает как для последних версий Oracle, так и для MySQL (удалите пробел после функции подсчета в строке).

PhatHV 19.04.2016 05:34

Этот скрипт всегда мне очень помогает! Спасибо,

Gilberto Galea 09.10.2018 19:17

Самое простое, что я могу придумать:

select job_number, count(*)
from jobs
group by job_number
having count(*) > 1;

Как я могу получить все столбцы?

Asif Mushtaq 26.12.2015 11:14

выберите * из заданий, где задано_номер (выберите задание_номер из группы заданий по заданию_номер, имеющему count (*)> 1)

JosephStyons 26.12.2015 19:31

Как насчет:

SELECT <column>, count(*)
FROM <table>
GROUP BY <column> HAVING COUNT(*) > 1;

Чтобы ответить на приведенный выше пример, это будет выглядеть так:

SELECT job_number, count(*)
FROM jobs
GROUP BY job_number HAVING COUNT(*) > 1;

Делает

select count(j1.job_number), j1.job_number, j1.id, j2.id
from   jobs j1 join jobs j2 on (j1.job_numer = j2.job_number)
where  j1.id != j2.id
group by j1.job_number

даст вам дублированные идентификаторы строк.

По-другому:

SELECT *
FROM TABLE A
WHERE EXISTS (
  SELECT 1 FROM TABLE
  WHERE COLUMN_NAME = A.COLUMN_NAME
  AND ROWID < A.ROWID
)

Работает нормально (достаточно быстро) при наличии индекса на column_name. И это лучший способ удалить или обновить повторяющиеся строки.

+1 хорошо работает для дубликатов нескольких столбцов (например, когда вы хотите добавить ограничение UNIQUE для нескольких столбцов), я нашел этот подход менее «жестким», чем GROUP BY, чтобы перечислить повторяющиеся значения полей + другие поля, если необходимо.

Frosty Z 27.01.2012 19:05

Просто чтобы уточнить (сначала это было неочевидно для меня) этот запрос возвращает только дубликаты, он не возвращает первую исходную запись, поэтому он хорошо работает для удаления дубликатов, основываясь на уникальном ограничении более чем 1 столбец. Вы можете выбрать повторяющиеся идентификаторы с помощью этого запроса, а затем использовать их для удаления дубликатов.

matthewb 21.11.2012 22:26

если вы измените <на! =, вы получите все повторяющиеся записи. не только 2-я или 3-я запись

moore1emu 04.01.2019 22:51

Вам даже не нужно иметь счетчик в возвращаемых столбцах, если вам не нужно знать фактическое количество дубликатов. например

SELECT column_name
FROM table
GROUP BY column_name
HAVING COUNT(*) > 1

В случае, если несколько столбцов идентифицируют уникальную строку (например, таблицу отношений), вы можете использовать следующие

Использовать идентификатор строки например emp_dept (empid, deptid, startdate, enddate) предположим, что empid и deptid уникальны и в этом случае идентифицируют строку

select oed.empid, count(oed.empid) 
from emp_dept oed 
where exists ( select * 
               from  emp_dept ied 
                where oed.rowid <> ied.rowid and 
                       ied.empid = oed.empid and 
                      ied.deptid = oed.deptid )  
        group by oed.empid having count(oed.empid) > 1 order by count(oed.empid);

и если в такой таблице есть первичный ключ, используйте первичный ключ вместо rowid, например id - pk, тогда

select oed.empid, count(oed.empid) 
from emp_dept oed 
where exists ( select * 
               from  emp_dept ied 
                where oed.id <> ied.id and 
                       ied.empid = oed.empid and 
                      ied.deptid = oed.deptid )  
        group by oed.empid having count(oed.empid) > 1 order by count(oed.empid);

SELECT   SocialSecurity_Number, Count(*) no_of_rows
FROM     SocialSecurity 
GROUP BY SocialSecurity_Number
HAVING   Count(*) > 1
Order by Count(*) desc 

Также вы можете попробовать что-то вроде этого, чтобы перечислить все повторяющиеся значения в таблице, скажем, reqitem

SELECT count(poid) 
FROM poitem 
WHERE poid = 50 
AND rownum < any (SELECT count(*)  FROM poitem WHERE poid = 50) 
GROUP BY poid 
MINUS
SELECT count(poid) 
FROM poitem 
WHERE poid in (50)
GROUP BY poid 
HAVING count(poid) > 1;

1. решение

select * from emp
    where rowid not in
    (select max(rowid) from emp group by empno);

На этом оригинальном плакате ни разу не упоминалось об удалении, только подсчет

Jeff 10.02.2016 18:15

Я обычно использую функцию Oracle AnalyticROW_NUMBER ().

Допустим, вы хотите проверить дубликаты уникального индекса или первичного ключа, построенного на столбцах (c1, c2, c3). Затем вы пойдете по этому пути, подняв ROWID строк, где количество строк, принесенных ROW_NUMBER(), равно >1:

Select * From Table_With_Duplicates
      Where Rowid In
                    (Select Rowid
                       From (Select Rowid,
                                    ROW_NUMBER() Over (
                                            Partition By c1 || c2 || c3
                                            Order By c1 || c2 || c3
                                        ) nbLines
                               From Table_With_Duplicates) t2
                      Where nbLines > 1)

Вот SQL-запрос для этого:

select column_name, count(1)
from table
group by column_name
having count (column_name) > 1;

Я знаю, что это старый поток, но это может кому-то помочь.

Если вам нужно распечатать другие столбцы таблицы при проверке повторного использования ниже:

select * from table where column_name in
(select ing.column_name from table ing group by ing.column_name having count(*) > 1)
order by column_name desc;

также при необходимости можно добавить некоторые дополнительные фильтры в предложение where.

Другие вопросы по теме