【问题标题】:Delete duplicate rows from a table and referenced table microsoft sql server从表中删除重复的行和引用的表microsoft sql server
【发布时间】:2017-09-06 15:14:02
【问题描述】:

我有桌子人:

PersonId     | FirstName   | LastName |
1            | 'John'      | 'Doe'    |
2            | 'Mike'      | 'Test'   |
3            | 'John'      | 'Doe'    |
4            | 'Mike'      | 'Test'   |
5            | 'John'      | 'Doe'    |
6            | 'John'      | 'Doe'    |

餐桌顾客:

CustomerId      | PersonId    |
1001            | 1           | 
1002            | 2           |
1003            | 3           |
1004            | 4           |
1005            | 5           |
1006            | 6           |

我想删除客户 1003,1004,1005,1006,因为他们的 Person 重复,但 PersonId 不一样。

这应该检查 Person 表中的 FirstName 和 LastName 并删除 Customer 表中的重复项,然后删除 Person 表中的重复项。 (3,4,5,6)

很抱歉,如果以前有人问过类似的问题,但我不能这样做。

【问题讨论】:

    标签: sql sql-server database tsql duplicates


    【解决方案1】:

    使用此查询查看重复项:

     with duplicatecte(personid,rownum)As
     (
        select personid ,
               row_Number() over(partition by FirstName+LastName order by personid) 
        from #person
       )
       select b.personid,customerid from duplicatecte a
       inner join #customer b on a.personid=b.personid where rownum>1
    

    修改此查询以删除如下

     with duplicatecte(personid,rownum)As
     (
      select personid ,
            row_Number() over(partition by FirstName+LastName order by personid) 
      from #person
      )
     delete b
     from duplicatecte a
     inner join #customer b on a.personid=b.personid where rownum>1
    

    【讨论】:

      【解决方案2】:

      检查一下。

      我们首先从客户表中删除。首先,我们通过使用 Row_number() 找到重复记录并删除必须排名超过 1 的 personid。

      以下查询显示重复记录:

          select ROW_NUMBER () over ( partition by firstname,lastname order by 
          PersonId ) RID, PersonId,FirstName,LastName 
          from #Person  
      

      找到重复项后,我们将其从客户表中删除,然后从人员中删除。

              delete from Customer where PersonId in 
              ( 
              select distinct PersonId P from 
              ( select ROW_NUMBER () over ( partition by firstname,lastname order by PersonId ) RID, PersonId,FirstName,LastName from #Person )a
              where RID>1
              )
      
              delete from Person where PersonId in 
              ( 
              select distinct PersonId P from 
              ( select ROW_NUMBER () over ( partition by firstname,lastname order by PersonId ) RID, PersonId,FirstName,LastName from #Person )a
              where RID>1
              )
      

      【讨论】:

        【解决方案3】:
        Begin Tran
        
        CREATE TABLE #Person(PersonId INT,FirstName NVARCHAR(50),LastName NVARCHAR(50))
        CREATE TABLE #Customer (CustomerId INT,PersonId INT)
        
        INSERT INTO #Person
        SELECT 1,'John','Doe'     UNION ALL
        SELECT 2 ,'Mike','Test'   UNION ALL
        SELECT 3 ,'John','Doe'    UNION ALL
        SELECT 4 ,'Mike','Test'   UNION ALL
        SELECT 5 ,'John','Doe'    UNION ALL
        SELECT 6 ,'John','Doe'    
        
        
        INSERT INTO #Customer
        SELECT 1001, 1     UNION ALL      
        SELECT 1002 ,2   UNION ALL        
        SELECT 1003 ,3    UNION ALL      
        SELECT 1004 ,4    UNION ALL       
        SELECT 1005,5      UNION ALL     
        SELECT 1006,6           
        
        GO
        WITH CTE (PersonId, DuplicateCount)
        AS
        (
            SELECT FirstName,
            ROW_NUMBER() OVER(PARTITION BY  FirstName,LastName ORDER BY  FirstName,PersonId) AS DuplicateCount
            FROM #Person
        )
        --Select * from CTE WHERE DuplicateCount>1
        DELETE FROM CTE WHERE DuplicateCount >1
        DELETE FROM #Customer WHERE PersonId NOT IN(SELECT PersonId FROM #Person)
        
        
        Select * from #Person
        SELECT * from #Customer
        
        ROLLBACK TRAN
        

        【讨论】:

          【解决方案4】:
          declare @tbl table 
          (pid int
          )
          ;with cte
          as
          (
          select t1.*,row_number() over (partition by firstname,lastname order by personid) as rownum
          from
          person t1
          )
          
          delete 
          from
           cte
           output deleted.personid  into @tbl where rownum>1
          
          
           delete from customer where personid in (select personid from @tbl)
          

          【讨论】:

            【解决方案5】:

            这对你有用:

            Declare @person As table
            (
             PersonId int,
             FirstName varchar(25),
             LastName varchar(25)
            )
            
            Declare @customer As table
            (
             CustomerId int,
             PersonId int
            )
            
            
            Insert Into @person (PersonId,FirstName,LastName) values(1,'John','Doe')
            Insert Into @person (PersonId,FirstName,LastName) values(2,'Mike','Test')
            Insert Into @person (PersonId,FirstName,LastName) values(3,'John','Doe')
            Insert Into @person (PersonId,FirstName,LastName) values(4,'Mike','Test')
            Insert Into @person (PersonId,FirstName,LastName) values(5,'John','Doe')
            Insert Into @person (PersonId,FirstName,LastName) values(6,'John','Doe')
            Insert Into @customer(CustomerId,PersonId) values(1001,1)
            Insert Into @customer(CustomerId,PersonId) values(1002,2)
            Insert Into @customer(CustomerId,PersonId) values(1003,3)
            Insert Into @customer(CustomerId,PersonId) values(1004,4)
            Insert Into @customer(CustomerId,PersonId) values(1005,5)
            Insert Into @customer(CustomerId,PersonId) values(1006,6)
            
            
            select p.PersonId into #temp from @person p right join 
            (Select PersonId,FirstName,LastName, ROW_NUMBER() over (partition by FirstName,LastName Order by PersonId) rownumber 
            from @person ) a
            on p.PersonId=a.PersonId where a.rownumber>1
            
            delete from @customer where PersonId in (select PersonId from #temp)
            delete from @person where PersonId in (select PersonId from #temp)
            
            
            select *from @customer
            select *from @person
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2020-07-07
              • 2013-02-13
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-03-23
              • 2023-04-10
              相关资源
              最近更新 更多