Sql 의 값을 찾는 복제본임을 테이블

39 의 중복 it& 쉽게 찾을 수 있는 한 필드:

SELECT name, COUNT(email) 
FROM users
GROUP BY email
HAVING COUNT(email) > 1

만일 우리가 테이블

<! - 언어: &gt 랑 없음 -;

ID   NAME   EMAIL
1    John   asd@asd.com
2    Sam    asd@asd.com
3    Tom    asd@asd.com
4    Bob    bob@asd.com
5    Tom    asd@asd.com

이 질의에서는 존, 샘, 톰 톰 같도다라고 그들은 모두 우리 부여하느뇨 같은 '이메일'.

하지만 제가 원하는 것은 '이메일' '이름' 와 동일한 데이터를 얻을 수 있습니다.

즉, I want to get ";;; Tom&quot Tom&quot &quot.

그 이유는 데릭쉐퍼드와 이: 내가 실수를 저질렀다 '이름' 와 '이메일', 허용된 삽입하려면 복제본임을 값. 지금 내가 할 수 있기 때문에, 중복 제거 / 변경하십시오 데릭쉐퍼드와 groupx 먼저 해당.

질문에 대한 의견 (2)
해결책
SELECT
    name, email, COUNT(*)
FROM
    users
GROUP BY
    name, email
HAVING 
    COUNT(*) > 1

단순히 두 그룹에서 열.

참고: 하지만 이 모든 것이 이전 ANSI 표준 비사양 집선됨 열의 그룹순 변경되었습니까 생각을 가지고 있는 &quot dependency&quot, 기능,:

&gt. 관계형 데이터베이스 이론에서, 둘 사이에 있는 함수 종속 구속조건으로 관계식에서 속성 집합 () 는 데이터베이스에서. 즉, 함수 종속 관계를 설명하는 것은 구속조건으로 속성을 관계.

일관됨 가 지원되지 않습니다.

[2]: https://www.postgresql.org/docs/current/static/sql-select.html # sql 그룹비

해설 (10)

이거 드세요.

declare @YourTable table (id int, name varchar(10), email varchar(50))

INSERT @YourTable VALUES (1,'John','John-email')
INSERT @YourTable VALUES (2,'John','John-email')
INSERT @YourTable VALUES (3,'fred','John-email')
INSERT @YourTable VALUES (4,'fred','fred-email')
INSERT @YourTable VALUES (5,'sam','sam-email')
INSERT @YourTable VALUES (6,'sam','sam-email')

SELECT
    name,email, COUNT(*) AS CountOf
    FROM @YourTable
    GROUP BY name,email
    HAVING COUNT(*)>1

출력:

name       email       CountOf
---------- ----------- -----------
John       John-email  2
sam        sam-email   2

(2 row(s) affected)

스케쳐내 dup id 를 사용합니다.

SELECT
    y.id,y.name,y.email
    FROM @YourTable y
        INNER JOIN (SELECT
                        name,email, COUNT(*) AS CountOf
                        FROM @YourTable
                        GROUP BY name,email
                        HAVING COUNT(*)>1
                    ) dt ON y.name=dt.name AND y.email=dt.email

출력:

id          name       email
----------- ---------- ------------
1           John       John-email
2           John       John-email
5           sam        sam-email
6           sam        sam-email

(4 row(s) affected)

복제물을 삭제하는 시도하시겠습니까:

DELETE d
    FROM @YourTable d
        INNER JOIN (SELECT
                        y.id,y.name,y.email,ROW_NUMBER() OVER(PARTITION BY y.name,y.email ORDER BY y.name,y.email,y.id) AS RowRank
                        FROM @YourTable y
                            INNER JOIN (SELECT
                                            name,email, COUNT(*) AS CountOf
                                            FROM @YourTable
                                            GROUP BY name,email
                                            HAVING COUNT(*)>1
                                        ) dt ON y.name=dt.name AND y.email=dt.email
                   ) dt2 ON d.id=dt2.id
        WHERE dt2.RowRank!=1
SELECT * FROM @YourTable

출력:

id          name       email
----------- ---------- --------------
1           John       John-email
3           fred       John-email
4           fred       fred-email
5           sam        sam-email

(4 row(s) affected)
해설 (0)

이거 드세요.

SELECT name, email
FROM users
GROUP BY name, email
HAVING ( COUNT(*) > 1 )
해설 (0)

스케쳐내 here& # 39 의 복제물을 삭제하는 것보다 훨씬 간단해진다는 길일 붙여넣습니다 하위 선택 / 홀수입니다 행뿐만 트리플 찾을 수 있다.

SELECT id, name, email 
FROM users u, users u2
WHERE u.name = u2.name AND u.email = u2.email AND u.id > u2.id

그래서 삭제할 수 있습니다.

DELETE FROM users
WHERE id IN (
    SELECT id/*, name, email*/
    FROM users u, users u2
    WHERE u.name = u2.name AND u.email = u2.email AND u.id > u2.id
)

이럴 훨씬 더 읽고 이해하기 쉽게

  • Note:* 실행하십시오 요청을 할 때까지 유일한 문제는 없을 때마다 각 복제본임을 행뿐만 삭제, 이후 1 개만 삭제할 수 있습니다
해설 (7)

다음과 같이 해 보십시오.

SELECT * FROM
(
    SELECT Id, Name, Age, Comments, Row_Number() OVER(PARTITION BY Name, Age ORDER By Name)
        AS Rank 
        FROM Customers
) AS B WHERE Rank>1
해설 (1)
 SELECT name, email 
    FROM users
    WHERE email in
    (SELECT email FROM users
    GROUP BY email 
    HAVING COUNT(*)>1)
해설 (0)

하지만 저는 조금 늦게 파티였죠 http://support. 정말 준활성 해결하십시오 찾는 모든 중복 id:

SELECT GROUP_CONCAT( id )
FROM users
GROUP BY email
HAVING ( COUNT(email) > 1 )
해설 (3)

이 코드를 시도하시겠습니까

WITH CTE AS

( SELECT Id, Name, Age, Comments, RN = ROW_NUMBER()OVER(PARTITION BY Name,Age ORDER BY ccn)
FROM ccnmaster )
select * from CTE 
해설 (0)

이 모든 선택 / deletes 제외한 각 그룹의 1 복제본임을 레코드전자문서의 기록하십시오 복제본의. 따라서 각 그룹의 모든 고유해야 레코드는유지합니다 + one of the 찻입 삭제하시겠습니까 기록하십시오 중복.

중복 선택합니다.

SELECT *
FROM table
WHERE
    id NOT IN (
        SELECT MIN(id)
        FROM table
        GROUP BY column1, column2
);

삭제하시겠습니까 복제:

DELETE FROM table
WHERE
    id NOT IN (
        SELECT MIN(id)
        FROM table
        GROUP BY column1, column2
);
  • 알고 있어야 더 많은 양의 기록, 성능 problems.* 생길 수 있습니다
해설 (4)

이렇게 될 경우 racle, 작동합니까 좋습니다.

create table my_users(id number, name varchar2(100), email varchar2(100));

insert into my_users values (1, 'John', 'asd@asd.com');
insert into my_users values (2, 'Sam', 'asd@asd.com');
insert into my_users values (3, 'Tom', 'asd@asd.com');
insert into my_users values (4, 'Bob', 'bob@asd.com');
insert into my_users values (5, 'Tom', 'asd@asd.com');

commit;

select *
  from my_users
 where rowid not in (select min(rowid) from my_users group by name, email);
해설 (0)
select name, email
, case 
when ROW_NUMBER () over (partition by name, email order by name) > 1 then 'Yes'
else 'No'
end "duplicated ?"
from users
해설 (3)

볼 수 있는지, 내가 원하는 경우 사용할 수 있는 테이블 아래에서 복제본임을 행뿐만 쿼리하지:

create table my_table(id int, name varchar(100), email varchar(100));

insert into my_table values (1, 'shekh', 'shekh@rms.com');
insert into my_table values (1, 'shekh', 'shekh@rms.com');
insert into my_table values (2, 'Aman', 'aman@rms.com');
insert into my_table values (3, 'Tom', 'tom@rms.com');
insert into my_table values (4, 'Raj', 'raj@rms.com');

Select COUNT(1) As Total_Rows from my_table 
Select Count(1) As Distinct_Rows from ( Select Distinct * from my_table) abc 
해설 (0)

39 는 쉬운 것, ve come up with 이 I&. It 는 일반적인 테이블 표현식에서는 (스테) 와 파티션에만 창 (내 생각엔 이러한 기능은 SQL 에서 2008년 이후).

이 예에서는 aspt 모든 학생들에게 복제본임을 이름과 도브. 필드를 확인할 복제에서는 다시 들어갈 것이다. 다른 모든 필드용 운영까지도 투영 (projection) 에 포함시킬 수 있습니다.

with cte (StudentId, Fname, LName, DOB, RowCnt)
as (
SELECT StudentId, FirstName, LastName, DateOfBirth as DOB, SUM(1) OVER (Partition By FirstName, LastName, DateOfBirth) as RowCnt
FROM tblStudent
)
SELECT * from CTE where RowCnt > 1
ORDER BY DOB, LName
해설 (0)
select id,name,COUNT(*) from India group by Id,Name having COUNT(*)>1
해설 (0)
  • 또한 이와 같은 값을 사용하여 복제본임을 스테 찾을 수 있다.
with MyCTE
as
(
select Name,EmailId,ROW_NUMBER() over(PARTITION BY EmailId order by id) as Duplicate from [Employees]

)
select * from MyCTE where Duplicate>1
해설 (0)

이 값을 어떻게 카운트입니다 중복됨?? 이 2 보다 2 배 이상 인컨텍스트 반복됩니다. 그냥 그 카운트입니다 지해로 충만하심이라 그룹화할 없습니다.

같은 단순한

select COUNT(distinct col_01) from Table_01
해설 (1)
 select emp.ename, emp.empno, dept.loc 
          from emp
 inner join dept 
          on dept.deptno=emp.deptno
 inner join
    (select ename, count(*) from
    emp
    group by ename, deptno
    having count(*) > 1)
 t on emp.ename=t.ename order by emp.ename
/
해설 (0)

(id) 를 선택할 수 있어 'id, id (id)' &gt table1 그룹순 카운트입니다 1;;

이 같은 특정 열에서 값을 제대로 검색을 사용할 수 있다고 생각한다.

해설 (2)

또한 이 일을 어쩌면 give it 노력하잖니 합니다.

  Select * from Users a
            where EXISTS (Select * from Users b 
                where (     a.name = b.name 
                        OR  a.email = b.email)
                     and a.ID != b.id)

네 경우엔 특히 优秀 검색하면 사용는 함정이거나 새로운 도메인 변경 등 일반 중복 접두어나 우편물. (예: 이 열 () 로 교체를 사용할 수 있습니다 다음

해설 (0)
SELECT * FROM users u where rowid = (select max(rowid) from users u1 where
u.email=u1.email);
해설 (0)