我有两个表Cars2016
和Cars2015
,它们具有完全相同的列。
我想简单地连接这两个表来创建这种查询:
SELECT Mark, COUNT(Models) FROM (Cars2015 UNION Cars2016) GROUP BY Mark
此查询旨在了解每个商标有多少型号,累计2015年和2016年。
我怎样才能有效?
谢谢!
答案 0 :(得分:2)
可能最有效的方法是计算每个表,然后将它们联合起来并加以总结。
SELECT Mark, SUM(count) AS count
FROM (
SELECT Mark, COUNT(*) AS count
FROM Cars2015
GROUP BY Mark
UNION ALL
SELECT Mark, COUNT(*) AS count
FROM Cars2016
GROUP BY Mark
) AS u
GROUP BY Mark
如果表中有Mark
的索引,则子查询应该非常有效。然后它正在组合包含聚合的相对较小的中间表,然后将它们组合起来。
另一种选择是使用MERGE
storage engine,它允许您创建包含其他表的并集的虚拟表:
CREATE TABLE Cars (
-- column names here
) ENGINE=MERGE UNION=(Cars2015, Cars2016);
SELECT Mark, COUNT(*)
FROM Cars
GROUP BY Mark;
答案 1 :(得分:1)
UNION运算符用于组合两个或多个SELECT语句的结果集。
- UNION中的每个SELECT语句必须具有相同的列数。
- 列也必须具有类似的数据类型。
- 每个SELECT语句中的列也必须采用相同的顺序。
试试这个:
SELECT models_count FROM (
SELECT COUNT(Models) models_count, Mark FROM Cars2015
UNION
SELECT COUNT(Models) models_count, Mark FROM Cars2016
)
GROUP BY Mark
请记住,UNION运算符默认情况下仅选择不同的值。要允许重复值,请使用UNION ALL。
答案 2 :(得分:1)
您需要将from子句中的2个表与子查询结合使用:
select mark, count(*)
from
(select models, mark from Cars2015
union all
select models, mark from Cars2016) t
group by mark
如果您只想获得整体计数(您在选择列表中没有标记字段),那么我会在选择列表中使用2个子库并添加它们:
select (select count(models) from Cars2015) + (select count(models) from Cars2016) as total_models