Преобразование TSQL в MS-Access SQL
TSQL (как используется в MS SQL Server 2000 и 2005) допускает несколько предложений JOIN, одно сразу за другим, без запятых или скобок. Попробуйте это в Access, и он бросает истерику: "Синтаксическая ошибка (отсутствует оператор) в выражении запроса ... "
Из того, что мне удалось собрать в Google-land, Access SQL хочет, чтобы скобки группировали предложения JOIN. Большинство советов о том, как это сделать, заключается в использовании конструкторского представления или мастера запросов, и пусть Access выяснит, куда поместить скобки (которые не требуются в стандартном SQL). Проблема в том, что я так привык делать свой SQL в текстовом редакторе (Notepad, 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 ответа:
Да, MS-Access-это тупо.
Я не думаю, что он существует (вероятно, не слишком большой рынок, чтобы перейти от MS-SQL/TSQL к MS-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
(Если у вас есть N внутренних соединений, вам понадобится N-1 открытая скобка в начале и одна в конце соединения; исключая последнюю)
Это работает в 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
Как вы можете видеть, таблицы, которые будут объединены, сгруппированы вместе.