检查sql表中的重复项并替换另一个表

时间:2015-11-05 09:39:55

标签: sql

我有一个包含重复条目的表(我忘了让NAME列唯一)

所以我现在有一个名为'表1'

的重复条目表
ID   NAME   
1    John F Smith  
2    Sam  G Davies  
3    Tom  W Mack  
4    Bob  W E Jone  
5    Tom  W Mack 

IE ID 3和5是重复的

表2

ID   NAMEID         ORDERS
1    2              item4
2    1              item5
3    4              item6
4    3              item23
5    5              item34

NAMEID是表1中的ID。表2 ID 4和5我希望NAMEID为3(Tom W Mack' s订单),如此

表2(正确版本)

ID   NAMEID         ORDERS
1    2              item4
2    1              item5
3    4              item6
4    3              item23
5    3              item34

是否有一种简单的方法可以查找和更新表2中的重复项NAMEID,然后从表1中删除重复项

3 个答案:

答案 0 :(得分:0)

在这种情况下,你可以做的是。 您可以找到您有多少重复记录。 为了找到可以使用的重复记录。

SELECT  ID, NAME,COUNT(1) as CNT FROM   TABLE1 GROUP BY ID, NAME

这将为您提供计数,并找到所有重复记录 并手动删除它们。

删除所有重复记录后,不要忘记更改表格。

答案 1 :(得分:0)

以下是如何做到的:

-- set up the environment
create table #t (ID int,  NAME  varchar(50))

insert #t values
(1,    'John F Smith'),  
(2,    'Sam  G Davies'),  
(3,    'Tom  W Mack'),
(4,    'Bob  W E Jone'),  
(5,    'Tom  W Mack') 

create table #t2 (ID int,  NAMEID int, ORDERS varchar(10))

insert #t2 values
(1,    2,              'item4'),
(2,    1,              'item5'),
(3,    4,              'item6'),
(4,    3,              'item23'),
(5,    5,              'item34')
go

-- update the referencing table first
;with x as (
    select id,
    first_value(id) over(partition by name order by id) replace_with
    from #t
),
y as (
    select #t2.nameid, x.replace_with
    FROM #t2 
    join x on #t2.nameid = x.id
    where #t2.nameid <> x.replace_with
)
update y set nameid = replace_with 

-- delete duplicates from referenced table
;with x as (
    select *, row_number() over(partition by name order by id) rn
    from #t
)
delete x where rn > 1

select * from #t
select * from #t2

请首先测试性能和有效性。

答案 2 :(得分:0)

让我们使用示例数据

INSERT INTO TableA
    (`ID`, `NAME`)
VALUES
    (1, 'NameA'),
    (2, 'NameB'),
    (3, 'NameA'),
    (4, 'NameC'),
    (5, 'NameB'),
    (6, 'NameD')

INSERT INTO TableB
    (`ID`, `NAMEID`, `ORDERS`)
VALUES
    (1, 2, 'itemB1'),
    (2, 1, 'itemA1'),
    (3, 4, 'itemC1'),
    (4, 3, 'itemA2'),
    (5, 5, 'itemB2'),
    (5, 6, 'itemD1')

(更容易发现重复项并检查结果)

让我们从一个简单的查询开始,以获取给定NAME的最小ID

SELECT
    NAME, min(ID)
FROM
    tableA
GROUP BY
    NAME

结果是[NameA,1], [NameB,2], [NameC,4], [NameD,6]

现在,如果您将其用作与基表一样的JOIN的不相关子查询,如

SELECT
    keep.kid, dup.id
FROM
    tableA as dup
JOIN
    (
        SELECT
            NAME, min(ID) as kid
        FROM
            tableA
        GROUP BY
            NAME
    ) as keep
ON
    keep.NAME=dup.NAME
    AND keep.kid<dup.id

它找到与子查询结果具有相同名称的所有重复项,但是不同的id +它还会为您提供“原始”的id,即该名称的最小ID。
例如,它是[1,3], [2,5]

现在您可以在像

这样的UPDATE查询中使用它
UPDATE
    TableB as b
JOIN
    tableA as dup
JOIN
    (
        SELECT
            NAME, min(ID) as kid
        FROM
            tableA
        GROUP BY
            NAME
    ) as keep
ON
    keep.NAME=dup.NAME
    AND keep.kid<dup.id
SET
    b.NAMEID=keep.kid
WHERE
    b.NAMEID=dup.id

结果是

ID,NAMEID,ORDERS
1, 2, itemB1
2, 1, itemA1
3, 4, itemC1
4, 1, itemA2 <- now has NAMEID=1
5, 2, itemB2 <- now has NAMEID=2
5, 6, itemD1

要从tableA中删除重复项,您可以再次使用第一个查询。