【问题标题】:Virtual table with fixed values mysql具有固定值mysql的虚拟表
【发布时间】:2018-05-10 05:25:04
【问题描述】:

是否可以有一个固定值的虚拟表?

我有下一个问题

SELECT 
    d1
FROM 
    (SELECT DISTINCT(date) AS d1 
     FROM table1 
     WHERE date IN ("2018-01-01","2018-05-04")
    ) t1
    RIGHT JOIN 
    (SELECT "2018-01-01","2018-05-04" ) t2
ON t1.d1=t2.?;

日期将相同。

如果没有这些日期的条目,我想获得 null。

但我需要在问号中添加别名。

或者我可能需要别的东西。

我怎样才能创建一个像这样的虚拟表,只是为了在连接中使用它。

-- Temp table --
value
2018-01-01
2018-05-04

我想避免任何 CREATE(临时表)。

因为SELECT 1,2,3 我得到的是水平值而不是垂直值。

也许这个例子解释得更好。 http://sqlfiddle.com/#!9/49f04/4

选择日期,日期取自日期所在的日期 ("2018-01-02","2018-01-04","2018-01-06");

# What I want to show is
#
# date1      date2
# 2018-01-02 null
# 2018-01-04 null
# 2018-01-06 2018-01-06 

由于前两个日期没有信息

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    你可以这样做:

    SELECT . . .
    FROM (SELECT '2018-01-01' as dte UNION ALL
          SELECT '2018-05-04' as dte
         ) d LEFT JOIN
         (SELECT DISTINCT date AS d1 FROM table1 WHERE date IN ("2018-01-01","2018-05-04")) t1
        ON t1.d1 = d.dte;
    

    这回答了您的具体问题。我不确定您真正想要做什么,但这是一种非常常见的查询技术。

    【讨论】:

    • 我想要做的是获取过滤器值,如果它们存在于表中,否则我想获得空值。日期是我要在我的应用程序中设置的过滤器。因此,如果 myfilters 是“2018-01-01”、“2018-02-01”并且我没有这些日期的数据,我希望看到两条为空的记录。我的日期是动态的,因此它们可以是 1 个或更多。跨度>
    • 我喜欢您的方法,只是我不知道是否有更好的方法来设置您使用 UNIION ALL 设置的值。我想避免为每个添加的日期添加 SELECT date as dte UNION ALL。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多