Как найти повторяющиеся значения в таблице в Oracle?
каков самый простой оператор SQL, который возвращает повторяющиеся значения для данного столбца и количество их вхождений в таблицу базы данных Oracle?
например: у меня JOBS таблица со столбцом JOB_NUMBER. Как я могу узнать, есть ли у меня дубликат JOB_NUMBERS, и сколько раз они дублируются?
13 ответов:
select column_name, count(column_name) from table group by column_name having count (column_name) > 1;
иначе:
SELECT * FROM TABLE A WHERE EXISTS ( SELECT 1 FROM TABLE WHERE COLUMN_NAME = A.COLUMN_NAME AND ROWID < A.ROWID )работает нормально (достаточно быстро), когда есть индекс
column_name. И это лучший способ удалить или обновить повторяющиеся строки.
самое простое, что я могу придумать:
select job_number, count(*) from jobs group by job_number having count(*) > 1;
вам не нужно даже иметь счет в возвращаемых столбцов, если вам не нужно знать фактическое количество дубликатов. например,
SELECT column_name FROM table GROUP BY column_name HAVING COUNT(*) > 1
Как насчет:
SELECT <column>, count(*) FROM <table> GROUP BY <column> HAVING COUNT(*) > 1;чтобы ответить на приведенный выше пример, это будет выглядеть так:
SELECT job_number, count(*) FROM jobs GROUP BY job_number HAVING COUNT(*) > 1;
в случае, когда несколько столбцов идентифицируют уникальную строку (например, таблицу отношений), вы можете использовать следующее
использовать идентификатор строки например, emp_dept(empid в, deptid, начальная дата, конечная дата) предположим, что 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 then
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 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 SocialSecurity_Number, Count(*) no_of_rows FROM SocialSecurity GROUP BY SocialSecurity_Number HAVING Count(*) > 1 Order by Count(*) desc
Я обычно использую Oracle Analytic функции ROW_NUMBER ().
скажем, вы хотите проверить дубликаты, которые у вас есть в отношении уникального индекса или первичного ключа, построенного на столбцах (
c1,c2,c3). Тогда вы пойдете этим путем, воспитываяROWIDs строк, где количество строк, приведенных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, если это необходимо.
также вы можете попробовать что-то вроде этого, чтобы перечислить все повторяющиеся значения в таблице, скажем 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;
Comments