如何使用union all删除重复项

时间:2016-11-19 20:54:23

标签: sql-server tsql

只需阅读此网站https://www.toptal.com/sql/interview-questions

他们展示了使用union all删除重复的技巧

SELECT * 
FROM mytable 
WHERE a = X 

UNION ALL 

SELECT * 
FROM mytable 
WHERE b = Y AND a != X 

以上脚本对我来说并不清楚。假设我想从两个employee表中获取数据,但是喜欢使用带有where子句的union all删除重复。

假设我的员工表具有ID,名称和薪水等结构。

现在使用union all发布一个示例SQL,它将显示来自2个表的不同行。

4 个答案:

答案 0 :(得分:3)

实际上,UNION会删除重复项。我们说我在表格中有3行数据。然后使用2个联合查询。查看union和union all之间的区别。

DECLARE @Employee TABLE
(
    ID INT,
    Name VARCHAR(100),
    Salary  INT
)

INSERT @Employee VALUES
(1, 'Alice', 50000),
(2, 'Bob', 40000),
(3, 'Charlie', 60000)

SELECT ID, Name, Salary FROM @Employee WHERE Salary >= 50000
UNION
SELECT ID, Name, Salary FROM @Employee WHERE Salary >= 60000

SELECT ID, Name, Salary FROM @Employee WHERE Salary >= 50000
UNION ALL
SELECT ID, Name, Salary FROM @Employee WHERE Salary >= 60000

结果:

+----+---------+--------+
| ID | Name    | Salary |
+----+---------+--------+
| 1  | Alice   | 50000  |
| 3  | Charlie | 60000  |
+----+---------+--------+

+----+---------+--------+
| ID | Name    | Salary |
+----+---------+--------+
| 1  | Alice   | 50000  |
| 3  | Charlie | 60000  |
| 3  | Charlie | 60000  |
+----+---------+--------+

答案 1 :(得分:2)

如果只有你必须使用UNION ALL,否则我会选择Handoko Chen的解决方案

Select Distinct *
 From (
        Select * From Employee1
        Union All
        Select * From Employee2
      ) A

答案 2 :(得分:2)

create table test_a(id numeric);

create table test_b(id numeric);

insert into test_a(id) values
  (10),
  (20),
  (30),
  (40),
  (50);

insert into test_b(id) values
  (10),
  (30),
  (50);
 GO 
 select * from test_b
 union all
  SELECT * FROM(select * from test_a  
  except 
  select * from test_b) ABC

答案 3 :(得分:0)

UNION删除重复项。而且为什么不以相同的结构在我的桌子和“什么都没有”之间使用它。

这是句子:

select id, name from mytable 

  UNION

  select id, name from mytable 
  where 1=2