目录
一、前言
我们都知道,在SQL中,UNION ALL / UNION的作用是将多个 SELECT 语句的结果合并成一个结果集,常见的使用场景是作为查询结果的拼接,比如下列语句,但实际上,UNION ALL / UNION也可以实现类似于创建临时表的功能。
SELECT column1 FROM table1 WHERE column1 >10UNIONALLSELECT column1 FROM table2 WHERE column1 <5;
二、UNION ALL实现临时表功能
1. 需求描述
因为公司生产和测试的数据库表有点差异,导致在测试上的SQL因为生产上表的缺失执行不了,询问前辈后可以将缺失的表写成临时表的形式,但该方式仅限于缺失的表或要替换的表的记录比较少且用到的记录固定不更改的情况。
2. SQL形式
- 子查询的形式
SELECT p.product_name, SUM(s.sale) sale FROM sales s
LECT JOIN (SELECT product_name, p_id
FROM product
WHERE1=1AND s.date >='2023-12-01 00:00:00'AND s.date <='2023-12-31 23:59:59' ) p
ON p.p_id = s.p_id
GROUPBY product_name
ORDERBY sale
- 临时表的形式
SELECT p.product_name, SUM(s.sale) sale FROM sales s
LECT JOIN (SELECT'chocolate'AS product_name, '101'AS p_id UNIONALLSELECT'strawberry'AS product_name, '101'AS p_id UNIONALLSELECT'vanilla'AS product_name, '101'AS p_id UNIONALLSELECT'caramel'AS product_name, '101'AS p_id
FROM product ) p
ON p.p_id = s.p_id
GROUPBY product_name
ORDERBY sale
当然,上述临时表的形式也可以使用WITH语句实现,如果数据库的版本支持的话。
三、总结
本文只是给出了一非常简单的例子,在实际的使用中可以根据情况再进行优化,但前提是替换的子查询的表所需的记录较少且固定,那么这个前提下一般不会替换业务表,可能是一些固定的对照表比如操作的n中情况的记录表等等