提问者:小点点

在MySQL查询中使用别名表而不创建视图


我如何使用MySQL5.6.43在不创建视图的情况下使下面的代码工作呢?

DROP VIEW IF EXISTS sla_calculation;
CREATE VIEW sla_calculation AS SELECT clock FROM service_alarms WHERE (serviceid = 473) AND
        (clock >= get_unix_init_clock(30, 'day'));


SELECT sla1.clock - sla2.clock AS failure_time
FROM sla_calculation AS sla1
LEFT JOIN sla_calculation AS sla2
    ON sla2.clock = (
        SELECT MAX(clock)
        FROM sla_calculation AS sla3
        WHERE sla3.clock < sla1.clock
    )
ORDER BY sla1.clock

我不想创建视图,因为这个查询将位于函数内部(更不用说它将在中包含变量,其中)。 我尝试了以下查询,但未成功(收到错误代码1146:表'test.sla1'不存在):

SELECT sla1.clock - sla2.clock AS failure_time
FROM
    (
        SELECT clock
        FROM service_alarms
        WHERE (serviceid = 473) AND
            (clock >= get_unix_init_clock(30, 'day'))
    ) AS sla1
    LEFT JOIN sla1 AS sla2
        ON sla2.clock = (
            SELECT MAX(clock)
            FROM sla1 AS sla3
            WHERE sla3.clock < sla1.clock
        )
ORDER BY sla1.clock

我知道我不能在from子句中使用别名,那么如何解决这个问题呢? 多谢!


共2个答案

匿名用户

您将使用lag():

SELECT clock - LAG(clock, 1) ORDER BY (clock)
FROM service_alarms sa
WHERE (serviceid = 473) AND
      (clock >= get_unix_init_clock(30, 'day')
ORDER BY clock;

这假定clock具有唯一值。 如果不是,也有类似的构造,但它们稍微复杂一点。

匿名用户

替代方案都需要MySQL8.0。

  • 使用窗口函数,如Gordon Linoff建议的lag()
  • 使用公共表表达式(CTE),可以创建一种“实时”视图,因此可以多次引用派生表,包括将其连接到自身。
  • 使用横向联接允许派生表引用联接中它前面的表。

如果您还没有使用MySQL8.0,那么我认为您必须使用视图。