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


Агрегируйте столбец по COUNT, затем используйте предложение HAVING, чтобы найти значения, которые появляются более одного раза.
SELECT column_name, COUNT(column_name)
FROM table_name
GROUP BY column_name
HAVING COUNT(column_name) > 1;
Спасибо - это ответ, который я только что нашел, и вы превзошли меня, разместив его здесь! : o)
Пожалуйста. Теперь я собираюсь опубликовать свой вопрос о различиях между count (столбец) и count (*). :)
+1 через 4 года, по-прежнему работает хорошо, и его можно настроить для выбора нескольких столбцов, если они также есть в group by, например: select column_one, column_two, count(*) from tablename group by column_one, column_two having count(column_one) > 1; и т. д.
или даже having count(*) > 1: D
+1 более 8 лет спустя, по-прежнему хорошо работает как для последних версий Oracle, так и для MySQL (удалите пробел после функции подсчета в строке).
Этот скрипт всегда мне очень помогает! Спасибо,
Самое простое, что я могу придумать:
select job_number, count(*)
from jobs
group by job_number
having count(*) > 1;
Как я могу получить все столбцы?
выберите * из заданий, где задано_номер (выберите задание_номер из группы заданий по заданию_номер, имеющему 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;
Делает
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, чтобы перечислить повторяющиеся значения полей + другие поля, если необходимо.
Просто чтобы уточнить (сначала это было неочевидно для меня) этот запрос возвращает только дубликаты, он не возвращает первую исходную запись, поэтому он хорошо работает для удаления дубликатов, основываясь на уникальном ограничении более чем 1 столбец. Вы можете выбрать повторяющиеся идентификаторы с помощью этого запроса, а затем использовать их для удаления дубликатов.
если вы измените <на! =, вы получите все повторяющиеся записи. не только 2-я или 3-я запись
Вам даже не нужно иметь счетчик в возвращаемых столбцах, если вам не нужно знать фактическое количество дубликатов. например
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);
На этом оригинальном плакате ни разу не упоминалось об удалении, только подсчет
Я обычно использую функцию 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.
другие решения stackoverflow.com/questions/4522431/…