Конвертировать TSQL в MS-Access SQL - PullRequest
7 голосов
/ 27 апреля 2009

TSQL (как используется в MS SQL Server 2000 и 2005) допускает несколько предложений JOIN, одно за другим, без запятых или круглых скобок. Попробуйте это в Access, и это вызывает приступ: «Синтаксическая ошибка (отсутствует оператор) в выражении запроса ...»

Из того, что я смог собрать в Google-land, Access SQL хочет, чтобы скобки сгруппировали предложения JOIN. Большинство советов о том, как это сделать, - использовать представление конструктора или мастер запросов и позволить Access выяснить, куда поместить скобки (которые НЕ требуются в стандартном SQL). Проблема в том, что я настолько привык делать SQL в текстовом редакторе (Блокнот, SSMS, VS2005 и т. Д.), Что мешают представлению дизайна и мастеру и заставляют мою оболочку ползать. Иногда мастера делают неверные предположения о том, что присоединяться, если есть несколько возможностей, и я настолько привык делать это самостоятельно в TSQL, что я бы предпочел не использовать мастера.

Нет ли инструмента, который преобразует TSQL в Access SQL, или хотя бы набор правил о том, где ставить скобки?

Пример:

SELECT ...
FROM Participant PAR
    INNER JOIN Individual IND 
        ON PAR.APETSID = IND.APETSID
    INNER JOIN Ethnicity ETH 
        ON IND.EthnicityID = ETH.ID
    INNER JOIN Education EDU 
        ON IND.EducationID = EDU.ID
    INNER JOIN Marital MAR 
        ON IND.Marital = MAR.ID
    INNER JOIN Participant-Probation PXP 
        ON PAR.ID = PXP.ParticipantID
    INNER JOIN Probation PBN 
        ON PXP.ProbationID = PBN.ID
    INNER JOIN Class-Participant CXP 
        ON PAR.ID = CXP.ParticipantID
    INNER JOIN Class CLS 
        ON CXP.ClassID = CLS.ID
    INNER JOIN Official OFR 
        ON PAR.ReferringPO = OFR.ID
    INNER JOIN Participant-Official PXO 
        ON PAR.ID = PXO.ParticipantID
    INNER JOIN Official OFA 
        ON PXO.OfficialID = OFA.ID

Ответы [ 2 ]

3 голосов
/ 28 апреля 2009

Да, MS-Access тупой.

Я не думаю, что он существует (возможно, не слишком большой рынок для перехода с MS-SQL / TSQL на MS-Access). Как правило, я использую представление «Дизайн», которое, на мой взгляд, не является волшебником. Затем я вручную добавляю таблицы, а затем (если я не создал правильную диаграмму отношений или что-то немного прикольное) вручную создаю связи в Designer. После этого я проверяю запрос в представлении SQL и корректирую по мере необходимости.

В случае вашего примера (как вы указали) вам, вероятно, понадобятся круглые скобки, и вам придется добавить их вручную. Вы, вероятно, хотите что-то вроде этого:

SELECT ...
FROM (((Participant PAR
    INNER JOIN Individual IND 
        ON PAR.APETSID = IND.APETSID)
    INNER JOIN Ethnicity ETH 
        ON IND.EthnicityID = ETH.ID)
    INNER JOIN Education EDU 
        ON IND.EducationID = EDU.ID)
    INNER JOIN Marital MAR 
        ON IND.Marital = MAR.ID

(если у вас N внутренних объединений, вам понадобится N-1 открывающая скобка в начале и одна в конце соединения; исключая последнее)

0 голосов
/ 28 апреля 2009

Это работает в Access.

SELECT *
FROM (((Individual AS IND 

INNER JOIN Ethnicity AS ETH 
    ON IND.EthnicityID = ETH.ID) 

INNER JOIN Education AS EDU 
    ON IND.EducationID = EDU.ID) 

INNER JOIN Marital AS MAR 
    ON IND.Marital = MAR.ID) 

INNER JOIN (((((((Participant AS PAR 

    INNER JOIN Official AS OFR 
        ON PAR.ReferringPO = OFR.ID) 

    INNER JOIN [Class-Participant] AS CXP 
        ON PAR.ID = CXP.ParticipantID) 

    INNER JOIN Class AS CLS 
        ON CXP.ClassID = CLS.ID) 

    INNER JOIN [Participant-Official] AS PXO 
        ON PAR.ID = PXO.ParticipantID) 

    INNER JOIN Official AS OFA 
        ON PXO.OfficialID = OFA.ID) 

    INNER JOIN [Participant-Probation] AS PXP 
        ON PAR.ID = PXP.ParticipantID) 

    INNER JOIN Probation AS PBN 
        ON PXP.ProbationID = PBN.ID) 

 ON IND.APETSID = PAR.APETSID

Как видите, таблицы, которые нужно объединить, сгруппированы.

...