UNION ALL返回的结果类似于UNION

时间:2019-07-29 03:12:41

标签: sql sql-server tsql

我正在使用带有Edx的Transact-SQL从查询数据中学习SQL。但是,我认为使用UNION ALL语法的部分存在一些问题。

首先,本教程创建了一个名为“雇员”的表,其中包含337行的名字和姓氏。然后,我想将所有的Employee表的名字,姓氏改为UNION ALL,将Customer表的名字,Customer表的姓氏(具有847行-包含很多重复的名字)。下面的代码是我输入的。

SELECT FirstName, LastName
FROM SalesLT.Employees
UNION ALL
SELECT FirstName, LastName
FROM SalesLT.Customers
ORDER BY LastName;

但是,该代码仅返回441行。这本身就是个问题,因为当您合并具有337行和847行的所有两组表时,它应该返回1184行! Union对该特定问题的所有语法与Union一样好(删除重复项)。我的错误在哪里?

PS :(在本教程中,应该将UNION ALL合并所有行而不删除重复项)

编辑:按如下所示运行计数代码:确实的确加起来了:

SELECT COUNT(FirstName) FROM SalesLT.Employees; --337 rows
SELECT COUNT(FirstName) FROM SalesLT.Customers; --104 rows

是因为教程是这样创建的employee表。

CREATE VIEW [SalesLT].[Customers]
as
select distinct firstname,lastname
from saleslt.customer
where lastname >='m'
or customerid=3;
GO
CREATE VIEW [SalesLT].[Employees]
as
select distinct firstname,lastname
from saleslt.customer
where lastname <='m'
or customerid=3;
GO

2 个答案:

答案 0 :(得分:0)

因此,数据库正在完全按照您的要求执行操作。在创建视图的语句中选择“不重复”表示每次从视图中进行选择时,都会从结果集中删除重复的行。

通过这种方式,认识到视图和表之间的区别很重要。我自己不使用Views,但是当我使用Views时,我给它们加上了vw前缀,因此不断提醒我不要看原始表。

更不用说您的视图中也包含其他选择条件(例如,姓氏<='m'或customerid = 3;)。由于VIEWS(通过DISTINCT和WHERE标准)过滤掉了很多行,因此数字不太可能匹配。

答案 1 :(得分:-1)

我认为这没问题。

select * from a union all select * from b order by c;