联合所有但只保留 T-SQL 中一张表中的重复项

问题描述

我有两张桌子想要合并。我只需要保留两个表之一的重复项。我试图找到它,但在任何地方都找不到。希望有人能帮忙。

例如: 表_1:

ID 产品 金额
1 A 10
2 B 10
3 C 10

表_2:

ID 产品 金额
3 C 9
4 A 100
5 B 100

想要的结果:

ID 产品 金额
1 A 10
2 B 10
3 C 9
4 A 100
5 B 100

所以总是使用 table_2 中的重复项。在此示例中,ID 3 是重复的,因此使用数量为 9 的 table_2 的副本。

如何用 T-sql 实现这一点?我使用了下面的代码

Select * from Table_1 where Table_1.id != Table_2.id
Union All
Select * from Table_2 

但后来我收到错误: '无法绑定多部分标识符“Table_2.ID”。'

解决方法

使用not exists

Select t1.*
from Table_1 t1
where not exists (select 1 from table_2 t2 where t2.id = t1.id)
Union All
Select t2.*
from Table_2 t2;
,

我假设您想要的是 Icon(Icons.icon)

EXISTS

但是,如果 SELECT T1.ID,T1.Product,T1.Amount FROM dbo.Table1 T1 WHERE NOT EXISTS (SELECT 1 FROM dbo.Table2 T2 WHERE T1.ID = T2.ID) UNION ALL SELECT T2.ID,T2.Product,T2.Amount FROM dbo.Table2 T2; 在两个表中都是唯一的,则 FULL OUTER JOIN 也可能有效

ID
,

试试这个:

SELECT  T1.*
FROM    @Table1 T1
WHERE   T1.ID NOT IN (SELECT ID FROM @Table2)
UNION
SELECT  T2.*
FROM    @Table2 T2
,

Union 会给你结果。 Union 将始终返回唯一值。如果您使用 union all,您将获得所有重复项。您的答案是使用 union all。

  SELECT 
  B.ID,B.Product,B.Amount
 FROM
   (

    SELECT 
      A.ID,A.Product,A.Amount,ROW_NUMBER() over (Partition BY  ID,Product order by  Amount ASC) AS [row_num]
    FROM
    (
       SELECT 
          tb_1.*
       FROM tb_1
       UNION ALL 
      SELECT 
        tb_2.* 
      FROM tb_2

     ) AS A
  ) AS B
  WHERE B.[row_num] = 1

Result