MySQL如何创建固定值虚拟表用于关联查询,无数据返回NULL?
如何创建包含固定值的纵向虚拟表(无需临时表)
当然可以实现这种需求!你要的是纵向排列固定值的虚拟表,不用CREATE临时表,用UNION ALL就能轻松搞定,完美解决你遇到的列别名和NULL返回问题。
核心思路:用UNION ALL构建纵向虚拟表
你之前用SELECT "2018-01-01","2018-05-04"得到的是横向的一行数据,而UNION ALL可以把每个固定值拆成单独的行,同时给列设置别名,正好满足纵向虚拟表的需求。
针对你的示例修改后的查询
先看你给出的具体场景:想要查询三个固定日期,原表有对应记录就返回值,没有就返回NULL。对应的SQL可以写成这样:
SELECT t_virtual.date1, t_actual.date2 FROM ( -- 这里构建纵向的固定值虚拟表,每个日期一行 SELECT '2018-01-02' AS date1 UNION ALL SELECT '2018-01-04' AS date1 UNION ALL SELECT '2018-01-06' AS date1 ) t_virtual -- 左连接原表的筛选结果,确保虚拟表的所有行都被保留 LEFT JOIN ( SELECT date AS date2 FROM dates WHERE date IN ('2018-01-02','2018-01-04','2018-01-06') ) t_actual ON t_virtual.date1 = t_actual.date2;
执行这个查询后,就能得到你想要的结果:
date1 date2 2018-01-02 NULL 2018-01-04 NULL 2018-01-06 2018-01-06
适配你最初的查询语句
回到你最开始的代码,修改后应该是这样:
SELECT t_virtual.d1, t1.d1 AS matched_d1 FROM ( -- 构建纵向虚拟表,每个日期一行并指定别名 SELECT '2018-01-01' AS d1 UNION ALL SELECT '2018-05-04' AS d1 ) t_virtual LEFT JOIN ( SELECT DISTINCT(date) AS d1 FROM table1 WHERE date IN ('2018-01-01','2018-05-04') ) t1 ON t_virtual.d1 = t1.d1;
小提醒:用UNION ALL而非UNION
这里用UNION ALL而不是UNION,是因为UNION会自动对结果去重,而我们的固定值都是明确且无重复的,UNION ALL可以跳过去重步骤,性能更优。
内容的提问来源于stack exchange,提问作者J. Ordaz
相关产品推荐
相关产品推荐

