Доступ переписывает - и ломает - мой запрос! - PullRequest
1 голос
/ 15 июня 2010

У меня есть запрос в MS Access (2003), который использует подзапрос.Часть подзапроса выглядит так:

...FROM (SELECT id, dt, details FROM all_recs WHERE def_cd="ABC-00123") AS q1,...

И когда я переключаюсь в Табличное представление, чтобы проверить результаты, все в порядке.

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

...FROM [SELECT id, dt, details FROM all_recs WHERE def_cd="ABC-00123"; ] AS q1,...

Так что все в порядке, что круглые скобки автоматически заменяются квадратными скобками, Access считает, что для этого нужно, хорошо!Но почему он добавляет ; в подзапрос, что приводит к его сбою?

Полагаю, я мог бы просто создать новые объекты запроса для этих подзапросов, но мне кажется немного глупым, что я должен есть , чтобы сделать это.

Ответы [ 3 ]

3 голосов
/ 15 июня 2010

Если вы хотите использовать более стандартный синтаксис производной таблицы, вам нужно переключиться в режим SQL 92. Однако следует помнить, что это также приводит к совместимости символов подстановки с SQL-сервером (% и _ вместо * и?).

Как указывает @HansUp, ошибка в вашем SQL - это не ";" но отсутствие завершающего периода после закрывающей квадратной скобки. Этот синтаксис был частью Jet до тех пор, пока я использую производные таблицы (которые вернутся к A97 или около того). У него есть недостаток предотвращения любых выражений внутри SQL производной таблицы, которые требуют квадратных скобок (таких как имена полей с пробелами в них), но я не думаю, что это ужасный недостаток, поскольку я избегаю именования вещей способами, которые требуют квадратных скобок .

EDIT:

Также обратите внимание, что в режиме SQL 92 есть другие проблемы, описанные в конце редактирования в этом моем сообщении .

3 голосов
/ 15 июня 2010

Ах, радости доступа. Конструктор запросов в целом плохо работает с производными таблицами. На самом деле существует более чем несколько конструкций, которые Jet соблюдает, и их нельзя правильно просмотреть в конструкторе запросов. Фактически, QBE будет искажать (как вы уже видели) многие из этих сложных запросов. В общем, вы должны просто предположить, что вы не можете безопасно просматривать дизайн производной таблицы или «сложного» запроса в QBE, но вместо этого только в коде.

1 голос
/ 15 июня 2010

Я видел то, что вы описали, когда Access заменяет круглые скобки подзапроса квадратными скобками. Тем не менее, я никогда не замечал, что после подзапроса добавляется точка с запятой.

Другая деталь в том, что с квадратными бэкэттами ваш запрос будет выглядеть следующим образом:

... FROM [ SELECT whatever FROM someTable ]. AS q ...

Обратите внимание на точку сразу после закрывающей квадратной скобки. Ваш образец не содержит точку. Поэтому мне интересно, что может произойти, если вы добавите точку и удалите точку с запятой (в представлении SQL) следующим образом:

...FROM [SELECT id, dt, details FROM all_recs WHERE def_cd="ABC-00123" ]. AS q1,...

Принимает ли Access это изменение и сохраняется ли оно при внесении каких-либо дальнейших изменений через конструктор запросов?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...