将 MS Access 查询转换为 MariaDB

Posted

技术标签:

【中文标题】将 MS Access 查询转换为 MariaDB【英文标题】:Converting MS Access queries to MariaDB 【发布时间】:2019-10-24 08:22:02 【问题描述】:

我正在努力创建 MariaDB SQL 命令,这些命令将产生与我目前在 MS Access 数据库中使用的这三个查询(如下)相同的输出。我的 Excel VBA 脚本使用 only 这个 SQL 命令调用下面的第三个 SQL 查询命令(Hours to Heat Elecric WH),其中日期值被动态替换。出于这个问题的目的,该命令看起来像这样:

SELECT ElectricWH_Data.* 
FROM ElectricWH_Data
WHERE (ElectricWH_Data.Date_Reading) > #06/01/19#;

这是结果表的摘要:

Date_Time 日期时间 最大 WH 输出 最小 WH 输出 18 年 6 月 27 日 0:52 18 年 6 月 27 日 00.52 60.38 43.56 18 年 6 月 28 日 0:52 18 年 6 月 28 日 00.52 60.50 44.44 18 年 6 月 29 日 0:32 18 年 6 月 29 日 00.32 60.13 45.38 18 年 6 月 30 日 0:32 18 年 6 月 30 日 00.32 60.19 47.13 7/1/18 0:12 07/01/18 00.12 60.50 47.56 7/2/18 0:42 07/02/18 00.42 60.44 44.94 7/3/18 0:42 07/03/18 00.42 60.38 46.88

我想复制这个过程,但使用 MariaDB 数据库和 SQL 命令。你能帮忙吗?

顺便说一下,我知道在 MariaDB 中日期和日期格式的处理方式不同。

以下是来自 MS Access 数据库的 SQL 查询。

GetTemDataByDay:

SELECT 
  Min(PiSolarWH.Electric_WH_Out) AS MinOfElectric_WH_Out, 
  Max(PiSolarWH.Electric_WH_Out) AS MaxOfElectric_WH_Out, 
  Format(PiSolarWH.Date_Reading,'mm/dd/yy') AS TheDay
FROM
  PiSolarWH
GROUP BY
  Format(PiSolarWH.Date_Reading,'mm/dd/yy');

ElectricWHData:

SELECT
  PiSolarWH.Date_Reading, 
  Format([PiSolarWH.Date_Reading],'mm/dd/yy') AS TheDate,
  Format([Date_Reading],'hh.mm') AS DayTime, 
  GetTempDataByDay.MaxOfElectric_WH_Out AS Expr1, 
  GetTempDataByDay.MinOfElectric_WH_Out AS Expr2
FROM
  GetTempDataByDay, PiSolarWH
WHERE 
  Format([PiSolarWH.Date_Reading],'mm/dd/yy') = [GetTempDataByDay].[TheDay] 
  AND GetTempDataByDay.MaxOfElectric_WH_Out = [PiSolarWH].[Electric_WH_Out];

加热电 WH 的时间:

SELECT
  PiSolarWH.Date_Reading, 
  Format([Date_Reading],'hh.mm') AS DayTime,
  GetTempDataByDay.MaxOfElectric_WH_Out, 
  PiSolarWH.Electric_WH_Out, 
  Format([PiSolarWH.Date_Reading],'mm/dd/yy') AS Expr1
FROM
  GetTempDataByDay,
  PiSolarWH
WHERE 
  GetTempDataByDay.MaxOfElectric_WH_Out = [PiSolarWH].[Electric_WH_Out]
  AND Format([PiSolarWH.Date_Reading],'mm/dd/yy') = [GetTempDataByDay].[TheDay];

【问题讨论】:

这些查询是否填充表,例如 MS Access 中的生成或追加表查询?似乎有比必要更多的格式化......无论如何,对于 mysql/MariaDB,不需要带有表和/或列名的[],因为通常使用tableName.columnName,或者只是columnName取决于查询以避免歧义。要格式化日期,就像你的一样,将是:DATE_FORMAT(Date_Reading, '%m/%d/%y') ...时间将是TIME_FORMAT(Date_Reading, '%h.%i')。与 MS Access 不同,日期字符串用单引号括起来,而不是 # 字符。 查询“GetTemDataByDay”在其他两个查询中被引用。至少 5 年前,当我使用 MS Access 和经典 ASP 页面时,我编写了这些查询。他们做了我想要的。但现在我尝试学习 MariaDB,并将旧的 ASP SQL 代码转换为我可以通过 MariaDB 设置运行的东西。我知道 MS SQL、SQL 和 MariaDB 之间的格式问题。 没关系,那你还需要了解哪些其他方面的信息呢? ...这些只是上一条评论中的概述。我已经将一些 MS Access 的东西转换成 MySQL。 很多很多事情需要改变。没有括号,完全不同的日期处理等等。 恐怕我的问题可能还不清楚。我了解 MS SQL 和 MariaDB SQL 之间的功能和格式差异,但感谢您的提醒。我试图了解是否可以使用 MariaDB 在其他查询或 SQL 语句中重复使用存储的 MS 查询。例如,您会注意到“GetTemDataByDay”在“ElectricWHData”和“Hours to Heat Elecric WH”中都被引用,“GetTemDataByDay”和“ElectricWHData”都在“Hours to Heat Elecric WH”中被引用。我在 MariaDB 中看不到如何做到这一点。 【参考方案1】:

好的,我想通了! MariaDB 的存储视图的工作方式类似于 MS Access 存储查询。我能够将三个 MS Access 查询(当然使用修改过的语法)作为存储的 VIEWS 添加到数据库中。这项工作与 MS Access 中的工作完全一样。这是一个例子:

CREATE VIEW GetTempDataByDay AS
SELECT 
  date_reading,
  Min(temps.Electric_WH_Out) AS MinOfElectric_WH_Out, 
  Max(temps.Electric_WH_Out) AS MaxOfElectric_WH_Out, 
  date(temps.Date_Reading) AS TheDay
FROM
  temps
GROUP BY
  date(temps.Date_Reading);

然后在我创建的其他两个 VIEWS 中使用它来复制 MS Access 存储的查询。

感谢您的宝贵时间....RDK

【讨论】:

以上是关于将 MS Access 查询转换为 MariaDB的主要内容,如果未能解决你的问题,请参考以下文章

MS Access 查询转换为 Sql Server

MS Access:将查询结果转换为带分隔符的字符串

如何在 MS Access 的追加查询中将数据类型从文本转换为是/否?

将 MS Access 查询(使用 IIF() 和 DATESERIAL())事务处理到 T-SQL

将 Access 交叉表查询转换为 SQL Server

将 MS Access Web 应用程序转换为 SQL Server Web 应用程序