programing

Oracle 테이블에서 중복된 값을 찾으려면 어떻게 해야 합니까?

newsource 2023. 2. 11. 09:28

Oracle 테이블에서 중복된 값을 찾으려면 어떻게 해야 합니까?

Oracle 데이터베이스 테이블에서 특정 열에 대한 중복 값과 발생 횟수를 반환하는 가장 간단한 SQL 문은 무엇입니까?

예를 들어 다음과 같습니다.나는 가지고 있다JOBS기둥과 함께 있는 표JOB_NUMBER중복된 항목이 있는지 확인하려면 어떻게 해야 합니까?JOB_NUMBERs, 그리고 그것들은 몇 번이나 중복되는가?

COUNT별로 열을 집계한 다음 HAVING 절을 사용하여 여러 번 나타나는 값을 찾습니다.

SELECT column_name, COUNT(column_name)
FROM table_name
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;

여러 열이 고유한 행(예: 관계 테이블)을 식별하는 경우 다음을 사용할 수 있습니다.

행 ID(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 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

는 중복된 행의 ID를 제공합니다.

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그런 다음 이 방향으로 이동하여 에서 가져온 행의 수를 표시합니다.ROW_NUMBER()>1:

Select *
From Table_With_Duplicates
Where Rowid In (Select Rowid
                  From (Select ROW_NUMBER() Over (
                                 Partition By c1, c2, c3
                                 Order By c1, c2, c3
                               ) nbLines
                          From Table_With_Duplicates) t2
                 Where nbLines > 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 구에 필터를 추가할 수도 있습니다.

이를 위한 SQL 요청은 다음과 같습니다.

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

1. 해결방법

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

또한 이와 같은 방법으로 테이블에 중복되는 모든 값을 나열할 수 있습니다. 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;

언급URL : https://stackoverflow.com/questions/59232/how-do-i-find-duplicate-values-in-a-table-in-oracle