oraclesql에서 반복 기록을 하고distinct를 사용하지 않아도 어떻게 실현합니까

2025 단어
distinct 키워드를 사용하면 검색 필드의 모든 기록이 같은 것만 필터할 수 있지만, 한 필드를 지정하는 것은 효과가 없고,distinct 키워드는 정렬되어 효율이 낮습니다.
중복 레코드는 제거할 수 있지만 하나의 필드만 가져올 수 있습니다. 현재 id,name 두 필드의 값을 동시에 가져옵니다.
select distinct id,name from t1은 여러 개의 필드를 찾을 수 있지만, 이 두 필드의 값이 모두 같은 기록만 제거할 수 있습니다.
그래서 distinct로 원하는 효과를 얻지 못하고 그룹 by로 이 문제를 해결할 수 있다.
예를 들어 표시할 필드는 A, B, C 세 개이고 A 필드의 내용은 다음 문장을 반복할 수 없습니다.
select A,min(B),min(C),count(*)from [table] where [조건] group by A
having [조건] order by A desc
제목의 보기 좋은 점을 표시하기 위해 select A,min(B),min(C),count(*)를 select A as A,min(B)as B,min(C)as C,count(*)as 중복 횟수로 바꿀 수 있습니다.
표시된 필드와 정렬 필드는 그룹 by에 포함되어야 합니다.
그러나 표시된 필드 패키지는min,max,count,avg,sum 등 집합 함수가 있을 때 그룹 by에 없을 수 있습니다
위 문장의min(B),min(C),count(*)
일반 조건은where 뒤에 쓴다
집합 함수가 있는 조건은 having 뒤에 적으세요.
만약 윗문장에서having에count(*)>1을 더하면 기록 A의 중복 횟수가 1보다 많은 기록을 찾을 수 있다
만약 윗문장에서having에count(*)>2를 더하면 기록 A의 중복 횟수가 2보다 많은 기록을 찾을 수 있다
상기에서 having에count(*)>=1을 더하면 모든 기록을 찾을 수 있지만 중복된 것은 하나만 표시하고 뒤에 중복된 횟수가 표시됩니다 --이것이 필요한 결과이며 문장은hibernate를 통과할 수 있습니다
다음 문장은 그 데이터가 중복된 것을 조회할 수 있다.
select 필드 1, 필드 2, count(*) from 테이블 이름 group by 필드 1, 필드 2 having count(*)> 1
위의 > 번호를 = 번호로 바꾸면 중복되지 않은 데이터를 조회할 수 있습니다.
예컨대
 
  
select count(*) from (select gcmc,gkrq,count(*) from gczbxx_zhao t group by gcmc,gkrq having
count(*)>=1 order by GKRQ)
select * from gczbxx_zhao where viewid in ( select max(viewid) from gczbxx_zhao group by
gcmc ) order by gkrq desc ---
.
한 면접 문제는distinct가 중복되는 효율이 매우 낮다는 것이다. 나는 인터넷에서 이 글을 본 방법이 그룹 by having으로 효율이 매우 높다고 말하는 것 같다고 말했다.
나는 한 테스트를 했는데, 하나의 상품표, 26만 개의 기록이 있는데, 단지 상품 번호만 색인을 만들고, 브랜드 명칭 필드를distinct로 만들었다
 
  
select brand,count(*) from tab_commbaseinfo group by brand having count(*) =1

평균 시간: 0.453
 
  
select distinct brand from tab_commbaseinfo

평균 시간: 0.39
다른 방법이 있는지 모르겠다.

좋은 웹페이지 즐겨찾기