我有一个包含重复条目的表(我忘了让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中删除重复项
答案 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中删除重复项,您可以再次使用第一个查询。