sql server—sql连接两个表并从两个表中删除重复项,但不丢失表中的任何重复项

cnwbcb6i  于 2021-07-26  发布在  Java
关注(0)|答案(6)|浏览(273)

我想连接两个表并从两个表中删除重复项,但保留在第一个表中找到的任何重复值。
t1级

Name
-----
A
A
B
C

t2级

Name
----
A
D
E

预期结果

A - > FROM T1
A - > FROM T1
B
C
D
E

我试过了 union 但从两个表中删除“a”的所有重复项。
我怎样才能做到这一点?

vmdwslir

vmdwslir1#

过滤器 T2 之前 UNION ALL ```
select col
from T1
union all
select col
from T2
where not exists (select 1 from T1 where T1.col = T2.col)

rslzwgfq

rslzwgfq2#

假设您希望从每个值重复次数最多的表中获得重复的数量,可以使用 ROW_NUMBER() 窗口功能,通过每个表中的重复集按顺序消除重复项。

SELECT Name FROM (
   SELECT Name, ROW_NUMBER() OVER ( PARTITION BY Name ORDER BY Name ) AS Row
     FROM T1
   UNION
   SELECT Name, ROW_NUMBER() OVER ( PARTITION BY Name ORDER BY Name ) AS Row
     FROM T2
) x
ORDER BY Name

为了看看这是怎么回事,我们加上两个 B 行到 T2 然后执行以下操作:

SELECT Name, ROW_NUMBER() OVER ( PARTITION BY Name ORDER BY Name ) AS Row
  FROM T1
Name  Row
A     1
A     2
B     1
C     1
SELECT Name, ROW_NUMBER() OVER ( PARTITION BY Name ORDER BY Name ) AS Row
  FROM T2
Name  Row
A     1
B     1
B     2
D     1
E     1

现在 UNION 他们没有 ALL 要合并并消除重复项:

SELECT Name, ROW_NUMBER() OVER ( PARTITION BY Name ORDER BY Name ) AS Row
  FROM T1
UNION
SELECT Name, ROW_NUMBER() OVER ( PARTITION BY Name ORDER BY Name ) AS Row
  FROM T2
Name  Row
A     1
A     2
B     1
B     2
C     1
D     1
E     1

最后一个查询就是消除 Row 列和排序结果,以确保升序。
有关演示,请参见SQLFiddle。

628mspwn

628mspwn3#

select * from T1
union all 
select * from T2 where name not in (select distinct name from T1)

sql fiddle演示

xxhby3vn

xxhby3vn4#

你应该用“union all”而不是“union”“union”删除其他重复记录,“union all”给出所有记录。
对于您的结果,因为我们在“where”中过滤了表2中的交集,所以不需要“union all”

select col1 from t1
union
select col1 from t2 where t2.col1 not in(select t1.col1 from t1)
35g0bw71

35g0bw715#

我不知道下面的代码是不是好的做法,但它的工作

select name from T1 

UNION

select name from T2 Where name not in (select name from T1)

上面的查询基于t1值过滤值,然后连接两个表值并显示结果。
希望对你有帮助谢谢。
注意:这不是获得结果的更好方法,它会影响你的表现。
我确信我在研究之后更新了更好的解决方案

66bbxpm5

66bbxpm56#

你想要所有的名字吗 T1 所有的名字都来自 T2 除了在 T1 .
所以你可以用 UNION ALL 对于2个案例和操作员 EXCEPT 筛选 T2 :

SELECT Name FROM T1
UNION ALL
(
  SELECT Name FROM T2
  EXCEPT
  SELECT Name FROM T1
)

请看演示。
结果:

> | Name |
> | :--- |
> | A    |
> | A    |
> | B    |
> | C    |
> | D    |
> | E    |

相关问题