2017-01-11 3 views
0

Я пытаюсь преобразовать запрос T-SQL в MS Access SQL и получить синтаксическую ошибку, которую я изо всех сил пытаюсь найти. Мой MS Access SQL-запрос выглядит следующим образом:Access SQL Синтаксическая ошибка: отсутствует оператор

INSERT INTO IndvRFM_PreSort (CustNum, IndvID, IndvRScore, IndRecency, IndvFreq, IndvMonVal) 
    SELECT 
     IndvMast.CustNum, IndvMast.IndvID, IndvMast.IndvRScore, 
     IndvMast.IndRecency, IndvMast.IndvFreq, IndvMast.IndvMonVal 
    FROM 
     IndvMast 
    INNER JOIN 
     OHdrMast ON IndvMast.IndvID = OHdrMast.IndvID 
    INNER JOIN 
     MyParameterSettings on 1=1].ProdClass 
    INNER JOIN 
     [SalesTerritoryFilter_Check all that apply] ON IndvMast.SalesTerr = [SalesTerritoryFilter_Check all that apply].SalesTerr 
    WHERE 
     (((OHdrMast.OrdDate) >= [MyParameterSettings].[RFM_StartDate])) 
    GROUP BY 
     IndvMast.CustNum, IndvMast.IndvID, IndvMast.IndvRScore, 
     IndvMast.IndRecency, IndvMast.IndvFreq, IndvMast.IndvMonVal, 
     [CustTypeFilter_Check all that apply].IncludeInRFM, 
     [ProductClassFilter_Check all that apply].IncludeInRFM, 
     [SourceCodeFilter_Check all that apply].IncludeInRFM, 
     IndvMast.FlgDontUse 

Я рассмотрел различия между MS Access SQL и T-SQL на http://rogersaccessblog.blogspot.com/2013/05/what-are-differences-between-access-sql.html и несколько других местах, но не повезло.

Вся помощь приветствуется.

обновление: Я удалил много линий, пытаясь найти ошибку синтаксиса и я все еще получаю ту же ошибку при запуске просто (который прекрасно работает с использованием T-SQL):

SELECT 
    IndvMast.CustNum, IndvMast.IndvID, IndvMast.IndvRScore, 
    IndvMast.IndRecency, IndvMast.IndvFreq, IndvMast.IndvMonVal 
FROM 
    IndvMast 
INNER JOIN 
    OHdrMast ON IndvMast.IndvID = OHdrMast.IndvID  
INNER JOIN 
    [My Parameter Settings] ON 1 = 1 
+0

Пожалуйста вывесить ошибку –

+0

Вы не нашли окончательного скобку в 'HAVING' заявление? –

+0

Почему HAVING (((IndvMast.IndRecency)> (date() - 7200)) AND (([CustTypeFilter_Check все, что применимо] .IncludeInRFM) = 1) И (([ProductClassFilter_Проверьте все применимые] .IncludeInRFM) = 1) AND (([SourceCodeFilter_Check все применимые] .IncludeInRFM) = 1) И ((IndvMast.FlgDontUse) Is Null)) вместо предложения WHERE? –

ответ

1

Есть несколько пунктов в вашем запросе, которые также должны были не в любой SQL-совместимой базе данных:

  1. У вас есть поля из таблиц в GROUP BY без ссылок в статьях FROM или JOIN.

  2. Кол-во полей в SELECT запрос не соответствует количеству полей в INSERT INTO.

  3. MyParameterSettings таблица неправильно соединена действительным ON.

Строго MS Access SQL элементы:

  1. Для более одного соединения, MS Access SQL требует парных скобок, но даже это может получить сложно, если некоторые таблицы соединяются вместе, и их паре результат присоединяется к внешний, где вы получаете вложенные соединения.

  2. ON 1=1 Выражение типа должно быть использовано в WHERE пункте и для перекрестного соединения таблиц в MyParameterSettings, как представляется, использовать запятую таблицу.

  3. Для вышеуказанных причин и более рекомендуется использовать этот диалект SQL для новичков, чтобы использовать построитель Query Design, предоставляющий табличные диаграммы и ссылки (если у вас есть MS Access GUI .exe, конечно). Затем, как только все таблицы подключаются графически, по крайней мере, к одному выбранному полю, перейдите в представление SQL для любой нюансированной логики сценариев.

Ниже приведена корректировка инструкции SQL для демонстрации совпадений в скобках и для наилучшей практики, использует псевдонимы таблиц, особенно с длинными именами таблиц.

INSERT INTO IndvRFM_PreSort (CustNum, IndvID, IndvRScore, IndRecency, IndvFreq, IndvMonVal) 

SELECT 
    i.CustNum, i.IndvID, i.IndvRScore, i.IndRecency, i.IndvFreq, i.IndvMonVal 
FROM 
    [MyParameterSettings] p, (IndvMast i 
INNER JOIN 
    OHdrMast o ON i.IndvID = o.IndvID) 
INNER JOIN 
    [SalesTerritoryFilter_Check all that apply] s ON i.SalesTerr = s.SalesTerr 
WHERE 
    (o.OrdDate >= p.[RFM_StartDate]) 
GROUP BY 
    i.CustNum, i.IndvID, i.IndvRScore, i.IndRecency, i.IndvFreq, i.IndvMonVal 

И в вашем меньшем SQL подмножестве, последняя таблица не нуждается в ON 1=1 состоянии и может быть избыточным, а в SQL Server. Просто запятая отдельная таблица будет достаточной, если вы намерены перекрестное соединение. То же самое делается в приведенном выше примере:

SELECT 
    IndvMast.CustNum, IndvMast.IndvID, IndvMast.IndvRScore, 
    IndvMast.IndRecency, IndvMast.IndvFreq, IndvMast.IndvMonVal 
FROM 
    [My Parameter Settings], IndvMast 
INNER JOIN 
    OHdrMast ON IndvMast.IndvID = OHdrMast.IndvID 
1

Я предполагаю, что есть некоторые ошибки в вашем запросе, первый (более важный).

Почему вы используете статью HAVING, чтобы добавить эти условия?

HAVING (((IndvMast.IndRecency)>(date()-7200)) 
AND (([CustTypeFilter_Check all that apply].IncludeInRFM)=1) 
AND (([ProductClassFilter_Check all that apply].IncludeInRFM)=1) 
AND (([SourceCodeFilter_Check all that apply].IncludeInRFM)=1) 
AND ((IndvMast.FlgDontUse) Is Null)) 

HAVING обычно используется в отношении условий на агрегатных функций (COUNT, SUM, MAX, MIN, AVG), для скалярного значения вы должны положить в WHERE пункте.

Второе: У вас есть 12 скобка открывается и 11 замкнуты в HAVING положение

+0

Запрос отлично работает в sql с условием наличия. Добавлена ​​закрывающая скобка и по-прежнему получает «Синтаксическую ошибку (отсутствующий оператор) в выражении запроса« IndvMast.IndvID = OHdrMast.IndvID ........ = [SalesTerritoryFilter_Проверьте все, что применимо] .SalesTer'' – GregH

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

  • Нет связанных вопросов^_^