mysql合并多个⽆关联的表的数据到⼀个视图
eg:使⽤NorthWind⽰例合并两个列:
select CustomerID from Customers
union
select CategoryID from Categories
⽤union实现这两个列的合并?
那位⾼⼿可以做到?
解决⽅法:
SQL code
select CustomerID from Customers
union
select cast(CategoryID as varchar) from Categories
⽤UNION,UNION ALL要确保3点:
1.第⼀个语句都要有列名
2.两个语句的列数要相等,不够要补⾜
3.所有对应列的类型要相同(或允许系统做隐式转化)
这样需要合并成⼀个VIEW就简单了:
create view v_all as
select CustomerID from Customers
union
select cast(CategoryID as varchar) from Categories
sql中union多表合并UNION⽤法:
MYSQL中的UNION
UNION在进⾏表链接后会筛选掉重复的记录,所以在表链接后会对所产⽣的结果集进⾏排序运算,删除重复的记录再返回结果。
举例说明:
select * from table1 union select * from table2
这个SQL在运⾏时先取出两个表的结果,再⽤排序空间进⾏排序删除重复的记录,最后返回结果集,如果表数据量⼤的话可能会导致⽤磁盘进⾏排序。
MySQL中的UNION ALL
UNION ALL只是简单的将两个结果合并后就返回。这样,如果返回的两个结果集中有重复的数据,那么返回的结果集就会包含重复的数据了。
举例说明:
select * from table1 union all select * from table2
注: 使⽤ UNION 时前⼀个 select column的个数要等于后⼀个select column的个数
如: table1: (id,createDate,lastUpdateDate,desc,num,hashCode),
table2: (id,createDate,lastUpdateDate,desc)
如果现在使⽤: select * from table1 UNION ALL select * from table2 则是不会成功的, 数据库为报:
Error
The used SELECT statements have a different number of columns
这是提⽰查询的两张表的字段不统⼀,如果table1⽐table2的字段内容多,可以使⽤空字符串来代替
select id,createDate,lastUpdateDate,desc,num,hashCode from table1 UNION ALL select id,createDate,lastUpdateDate,desc,'','' from table2
如果⾥⾯有不想要的,千万要记住前⾯查询内容要和后⾯查询内容的字段个数要⼀样,前⾯你查询4个,后⾯也要相应的放4个,这样就不会
提⽰参数数量不同的错误了。
其实稍稍修改⼀下就可以了
对于 'select id,createDate,desc,hasCode from table1' 可以任意选择4个field
从效率上说,UNION ALL 要⽐UNION快很多,所以,如果可以确认合并的两个结果集中不包含重复的数据的话,那么就使⽤UNION ALL。如果遇到两张表数据不同来集合查询,可以使⽤union all这个函数进⾏操作
SELECT COUNT(c.a) FROM (
(SELECT UID a,ID,SERIAL,ParkName,CardNO,ScoreRealPay,PayFlag,PayType,Createtime FROM cp_consumption_record WHERE UID=761 AND PayFlag=1 ORDER BY Createtime DESC) UNION ALL (SELECT UID
a,CpResID,CpParkID,ParkSERIAL,CarCode,Price,BusinessType,CardNO,CreateDate FROM cp_reservation WHERE UID=761 AND BusinessType IN(1,2,3) ORDER BY CreateDate DESC)
) c
这是查询结果集共有多少条数据,
如果还有查询条件,直接在c后⾯添加就可以,⽐如按照时间进⾏查询
SELECT c.UID,c.ScoreRealPay,c.PayFlag,c.PayType FROM (
(SELECT UID AS UID,ID AS ID,SERIAL AS SERIAL ,ParkName AS ParkName,CardNO CardNO,ScoreRealPay ScoreRealPay,PayFlag PayFlag,PayType PayType,Createtime Createtime FROM cp_consumption_record WHERE UID=761 AND PayFlag=1 ORDER BY Createtime DESC) UNION ALL (SELECT UID a,CpResID,CpParkID,ParkSERIAL,CarCode,Price,BusinessType,CardNO,CreateDate FROM cp_reservation WHERE UID=761 AND BusinessType IN(1,2,3) ORDER BY CreateDate DESC)
) c ORDER BY Createtime DESC/ASC
这⾥强调⼀下,你要按照什么样的条件进⾏查询时,要分别在select⼦查询中添加上条件,最后在按照统⼀的时间倒序或者正序
注:
缺省的情况下,UNION ⼦句不返回重复的记录.如果想显⽰所有记录,可以加ALL选项
UNION运算要求查询具有相同数⽬的字段.但是,字段数据类型不必相同.
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论