2017-02-22 29 views
0

Попытки преобразовать эту рабочую SQL из базы данных MySql для работы с базой данных MS Access:конвертировать 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 
+0

@SqlZim: Ваш SQL должен работать, за исключением 'WHERE u.LastName LIKE 'Bar *'' – Gustav

+0

это не работает - как работает Access с '' e.ClassName'. '? – BarclayVision

+0

Ваши потребности в IF быть «IIF». Кроме того, я был удивлен, что вы можете использовать «вокруг ссылок таблицы/поля», но я узнал что-то новое ... день - это успех! –

ответ

0

я не уверен, если его выровнен точно так, как я хочу это (нужно первое/последнее в первом столбце, а GROUP BY была главная проблема, но это возвращает результаты от доступа:

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; 
+0

На самом деле я обновлю ответ - все это прекрасно работает. казалось бы, нужны '[LAST]' и '[ClassName]' – BarclayVision

+0

Основная проблема - это предложение GROUP BY, требующее * FirstName * и * LastName *. См. Мое редактирование выше. – Parfait

+0

yep - у вас была опечатка, а также 'ALIKE' – BarclayVision

1

Несколько пунктов синтаксиса требует преобразования:

  1. Очень важный элемент и, к сожалению, пользователи MySQL, как правило, злоупотребляют (которые работают с выключенным режимом only full group by). В SQL, GROUP BY должен включать ВСЕ НЕАГЕРИРОВАННЫЕ столбцы. Поэтому добавьте FirstName и LastName к группировке.
  2. MS Access SQL не использует IF для условных выражений, но IIF().
  3. Хотя Access использует обратные и квадратные скобки, его можно использовать только для того, чтобы заключать имена столбцов и/или имена таблиц не вместе. Подумайте о том, что MySQL позволяет использовать обратные ссылки вокруг имен столбцов и/или таблиц, но не в той же паре приложений (только в MySQL 5.5).
  4. Access не идентифицирует псевдонимы столбцов с любой одной или двойной кавычкой, которая является стандартом ANSI. Интересно, что вы можете включить цитаты, но они будут отображаться буквально в имени столбца. MySQL придерживается двойной котировки ANSI для идентификаторов объектов с ANSI-Quotes sql mode on.
  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 
+0

все еще получает 'сервер 500 ошибка' - ??? – BarclayVision

+0

ваш пример использует 'e.'''ClassName''', но не в' u.LastName' - должно ли это правило применяться ко всем? – BarclayVision

+0

См. Обновление. Я добавил синтаксис «GROUP BY». Извините за более ранний вид! А backticks являются необязательными, как правило, только для спасения зарезервированных слов и имен с пробелами/специальными символами. – Parfait

Смежные вопросы