繁体   English   中英

转换MySQL SQL以在MS-Access数据库中工作

[英]convert MySQL SQL to work in MS-Access Database

尝试从MySql数据库转换此工作SQL以在MS Access数据库上工作:

    SELECT u.LastName AS LAST, u.FirstName AS FIRST,
    MAX(IF(`e.ClassName`='MDC (Intro)', DateCompleted, NULL)) AS 'MDC', 
    MAX(IF(`e.ClassName`='800 MHz Radio (Intro)', DateCompleted, NULL)) AS 'RADIO',
    MAX(IF(`e.ClassName`='ePCR (Intro)', DateCompleted, NULL)) AS 'ePCR',
    MAX(IF(`e.ClassName`='Firehouse (Incident)', DateCompleted, NULL)) AS 'Firehouse'
    FROM EnrollmentsTbl e INNER JOIN UsersDataTbl u ON e.UserName = u.UserName
    GROUP BY e.UserName 
    WHERE u.LastName LIKE 'Bar%' 
    ORDER BY u.LastName

一些语法需要转换:

  1. 一个非常重要的项目,一个不幸的是,MySQL用户倾向于滥用( 仅在完全按模式分组的情况下运行)。 在SQL中, GROUP BY必须包括所有非聚合列。 因此,将FirstNameLastName添加到分组中。
  2. MS Access SQL不会将IF用于条件表达式,而IIF()用作条件表达式。
  3. 尽管Access确实使用了反引号和方括号,但它只能用于将列名和/或表名一起封闭。 想一想,MySQL允许在列名和/或表名周围加反引号,但不能在同一封装对中同时加引号(仅在MySQL 5.5中进行了检查)。
  4. Access不会使用任何单引号或双引号(后者是ANSI标准)来标识列别名。 有趣的是,您可以包含引号,但引号实际上会显示在列名中。 MySQL在启用ANSI-Quotes sql模式的情况下遵守对象标识符的ANSI双引号。
  5. 最后,通过ODBC的访问确实将%通配符用于LIKE评估,但是默认情况下,通过GUI .exe程序的访问使用* 但是其ALIKE运算符在两种设置类型中均有效。

考虑以下SQL调整:

SELECT u.LastName AS `LAST`, u.FirstName AS `FIRST`,
       MAX(IIF(e.`ClassName`='MDC (Intro)', DateCompleted, NULL)) AS `MDC`, 
       MAX(IIF(e.`ClassName`='800 MHz Radio (Intro)', DateCompleted, NULL)) AS `RADIO`,
       MAX(IIF(e.`ClassName`='ePCR (Intro)', DateCompleted, NULL)) AS `ePCR`,
       MAX(IIF(e.`ClassName`='Firehouse (Incident)', DateCompleted, NULL)) AS `Firehouse`
FROM EnrollmentsTbl e 
INNER JOIN UsersDataTbl u ON e.UserName = u.UserName
GROUP BY u.LastName, u.FirstName, e.UserName 
WHERE u.LastName ALIKE 'Bar%' 
ORDER BY u.LastName

我不确定它是否完全符合我的要求(在第一列中需要第一/最后一个,并且GROUP BY是主要问题,但这将返回Access的结果:

SELECT u.LastName AS [LAST], 
Max(IIf([e.ClassName]='MDC (Intro)',Format([DateCompleted],'mm/dd/yyyy'),Null)) AS [MDC], 
Max(IIf([e.ClassName]='800 MHz Radio (Intro)',Format([DateCompleted],'mm/dd/yyyy'),Null)) AS [RADIO], 
Max(IIf([e.ClassName]='ePCR (Intro)',Format([DateCompleted],'mm/dd/yyyy'),Null)) AS [ePCR], 
Max(IIf([e.ClassName]='Firehouse (Incident)',Format([DateCompleted],'mm/dd/yyyy'),Null)) AS [Firehouse]
FROM EnrollmentsTbl e 
INNER JOIN UsersDataTbl u ON e.UserName = u.UserName
GROUP BY u.LastName, u.FirstName, e.UserName
WHERE u.UserName LIKE 'bar%' 
ORDER BY u.LastName;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM