我有两张表 table1
和 table2
。
它们都是相同的,只是table2
没有主键或约束。
我需要将数据从table2
复制到table1
。
table1
不接受重复的行。
table1
中的主键基于5列:col1
,col2
,col3
,col4
,col5
。
table2
有一堆重复的行。
我可以使用以下内容获取table2
中的重复行:
SELECT count(*) as 'Occurence' col1, col2, col3, col4, col5
FROM table2
GROUP BY col1, col2, col3, col4, col5
HAVING count(*) > 1
我可以使用以下查询删除一个副本:
WITH cte
AS ( SELECT col1, col2, col3, col4, col5,
row_number() OVER( PARTITION BY col1, col2, col3, col4, col5 ORDER BY col1 ) AS [rn]
FROM table2
)
DELETE cte WHERE [rn] > 1
但我想要的是删除找到的所有重复项。
要说清楚有两行:
Col1 Col2 Col3 Col4 Col5 Col6
1 2 3 4 5 TEXAS
1 2 3 4 5 NEW YORK
因此,上面发布的第一个查询会给我一个结果:
Occurence Col1 Col2 Col3 Col4 Col5
2 1 2 3 4 5
第二个查询将删除上述任何一个(即TEXAS或NEW YORK)。 我想删除TEXAS和NEW YORK。
我的桌子是这样的:
table1
有 x 行数。
table2
有 x + y 行数,即它包含table1
的所有行加上一些。
以上面的例子为例,
TEXAS同时适用于table1
和table2
。
TEXAS在table2
中出现两次。
但纽约仅在table2
。
当我将数据从table2
复制到table1
时,只能插入NEW YORK(应插入)。
使用 DISTINCT
查询或 rn > 1
时,table2
和<{1}}中的TEXAS仍然存在(发生一次)< strong> INSERT
会失败。
答案 0 :(得分:0)
使用ROW_NUMBER OVER PARTITION BY
你可以获得重复的行。在Delete from Inner JOIN
表和CTE
的帮助下,您可以删除重复的行。
WITH cte
AS (SELECT col1,col2,col3,col4,col5,
Row_number() OVER(PARTITION BY col1, col2, col3, col4, col5
ORDER BY col1) AS [rn]
FROM table2)
DELETE A
FROM table2 a
JOIN cte b
ON a.col1 = b.col1
AND a.col2 = b.col2
AND a.col3 = b.col3
AND a.col4 = b.col4
AND a.col5 = b.col5
WHERE rn > 1
答案 1 :(得分:0)
在您的CTE中,您刚刚删除了不等于1的行。因此,它不允许删除任何一个德克萨斯州或纽约州。我略微更改了您的查询并获得[rn]的最大值并删除了具有max&gt;的行1。
WITH cte
AS
(
SELECT col1,col2,col3,col4, col5, MAX(rn) AS Max FROM (SELECT col1,col2,col3,col4, col5,
row_number() OVER(PARTITION BY col1,col2,col3,col4, col5 ORDER BY col1) AS [rn]
FROM table2) AS Table1 GROUP BY col1,col2,col3,col4, col5
)
DELETE cte WHERE [Max] > 1
试试这个。
答案 2 :(得分:0)
如果需要的只是将数据加载到table1中,则不必从table2中删除任何内容。以下查询应该足够了。
INSERT INTO table1(col1,col2,col3,col4,col5,col6)
SELECT * FROM table2 otr
WHERE NOT EXISTS(
SELECT 1
FROM table2 inr
WHERE inr.col1=otr.col1
AND inr.col2=otr.col2
AND inr.col3=otr.col3
AND inr.col4=otr.col4
AND inr.col5=otr.col5
GROUP BY inr.col1,
inr.col2,
inr.col3,
inr.col4,
inr.col5
HAVING COUNT(1) > 1)