联合结果集不必受被联合的多个结果集之间的关系限制,不过使用UNION仍然有两个基本的原则需要遵守:
1. 每个结果集必须有相同的列数;
2. 每个结果集的列必须类型相容。
1. 相同的列数
首先看第一个原则,每个结果集必须有相同的列数,两个不同列数的结果集是不能联合在一起的。比图下面的SQL语句是错误的:
SELECT FNumber, FName, FAge, FDepartment FROM T_Employee
UNION
SELECT FIdCardNumber, FName, FAge FROM T_TempEmployee
因为第一个结果接返回了4列数据,而第二结果集则返回了3列数据,数据库系统并不会用控制将第二个结果接补足为4列。如果需要将位置列补足为一个默认值,那么可以使用常量字段,比如下面的SQL语句就将第二结果集中与FDepartment对应的字段值设定为“临时工,不属于任何一个部门”:
SELECT FNumber, FName, Fage, FDepartment FROM T_Employee
UNION
SELECT FIdCardNumber, FName, FAge, '临时工, 不属于任何一个部门' FROM T_TempE mployee
执行结果:
+---------------+---------+------+--------------------------------+
| FNumber | FName | FAge | FDepartment |
+---------------+---------+------+--------------------------------+
| DEV001 | Tom | 25 | Development |
| DEV002 | Jerry | 28 | Development |
| DEV003 | Potter | NULL | Development |
| HR001 | Jane | 23 | HumanResource |
| HR002 | Tina | 25 | HumanResource |
| IT001 | Smith | 28 | InfoTech |
| IT002 | NULL | 27 | InfoTech |
| SALES001 | Timmy | 25 | Sales |
| SALES002 | Stone | 35 | Sales |
| 1234567890121 | Sarani | 33 | Special Part - Temporary Staff |
| 1234567890122 | Tom | 26 | Special Part - Temporary Staff |
| 1234567890123 | Yalaha | 38 | Special Part - Temporary Staff |
| 1234567890124 | Tina | 26 | Special Part - Temporary Staff |
| 1234567890125 | Konkaya | 29 | Special Part - Temporary Staff |
| 1234567890126 | Fotifa | 46 | Special Part - Temporary Staff |
| 1234567890127 | James | 24 | Special Part - Temporary Staff |
+---------------+---------+------+--------------------------------+
2. 类型相容
联合结果集的第二原则上:每个结果集的列必须类型相容,也就是说结果集的每个对应列的数据类型必须相同或者能够转换为同一种数据类型。比如下面SQL语句中MySQL中可以正确地执行:
SELECT FIdCardNumber, FAge, FName FROM T_TempEmployee
UNION
SELECT FNumber, FName, FAge FROM T_Employee
注:这SQL语句能在MySQL正常运行。可以看到MySQL将FAge转换为文本类型,以便于与FName字段的值匹配。
不过这句SQL语句在MS SQL Server、Oracle、DB2中执行则会报出错误信息
因为这邪恶数据库不会像MySQL那样进行默认的数据类型转换。