You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:45:34