我正在使用带有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
答案 0 :(得分:0)
因此,数据库正在完全按照您的要求执行操作。在创建视图的语句中选择“不重复”表示每次从视图中进行选择时,都会从结果集中删除重复的行。
通过这种方式,认识到视图和表之间的区别很重要。我自己不使用Views,但是当我使用Views时,我给它们加上了vw前缀,因此不断提醒我不要看原始表。
更不用说您的视图中也包含其他选择条件(例如,姓氏<='m'或customerid = 3;)。由于VIEWS(通过DISTINCT和WHERE标准)过滤掉了很多行,因此数字不太可能匹配。
答案 1 :(得分:-1)
我认为这没问题。
select * from a union all select * from b order by c;