Подтвердить что ты не робот

Восклицательные знаки в SQL запроса

Я читаю этот запрос, и я наткнулся на строку, где я не понимаю, что это линия

[FETT List]![FETT Search]
  • Список FETT - это таблица
  • FETT Search - это столбец в списке FETT

Может кто-нибудь объяснить, что означает восклицательный знак?

Спасибо

4b9b3361

Ответ 1

Как правило, вы видите это в коде MS Access (для восклицательного знака, периода для SQL-сервера). Вы можете ссылаться на столбец по столбцу table.column или если вы даете таблице псевдоним, а затем по alias.column. Вы можете сделать это, если хотите быть конкретными при использовании объединений, или вам может понадобиться сделать это, когда две (или более) таблицы в запросе/объединении имеют одинаковое имя столбца в каждой таблице.

Ответ 2

Ну, вы узнаете что-то новое каждый день!

Я изначально планировал объяснить, что если бы вы сказали, что ссылка была [Forms]! [FETT List]! [FETT Search], тогда было бы легко объяснить, как ссылку на элемент управления [FETT Search] в форме [FETT List]. Но без родительской коллекции (либо отчетов форм) она не похожа на действительную ссылку в любом контексте в инструкции SQL.

Но потом я решил проверить его и обнаружил (к моему удивлению), что этот оператор SQL считается действительным в форме Access:

  SELECT [tblCustomer]![LastName] AS LastName 
  FROM tblCustomer;

В Access это эквивалентно 100% эквиваленту этого оператора SQL:

  SELECT tblCustomer.LastName 
  FROM tblCustomer;

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

Теперь, длинный ответ на общий вопрос! (бит) против. (Точка):

В общем случае в Access оператор bang определяет коллекцию объектов по умолчанию и ее элементы. Оператор dot определяет объект и его методы, свойства и элементы.

То есть для Access и применяется к объектам Access и объектной модели для Access.

Но вы также используете SQL в Access, поэтому у вас также есть TableName.FieldName в SQL, где оператор точки разделяет элемент в коллекции по умолчанию. TableName.FieldName может считаться коротким для TableName.Fields( "FieldName" ), как вы находите в Forms! MyForm! MyControl эквивалентно Forms! MyForm.Controls( "MyControl" ). Но это правило не применяется в SQL - TableName.Fields( "FieldName" ) недопустимо SQL, только TableName.FieldName is.

Итак, вы должны держать прямо, какая парадигма контролирует пространство имен, в котором вы работаете, т.е. является ли это пространством имен Access или пространством имен SQL.

Forms! MyForm также эквивалентен Forms.Item( "MyForm" ), поэтому сверхдлинная форма будет FormsItems ( "MyForm" ). Элементы управления ( "MyControl" ). Обратите внимание, как оператор bang является ярлыком для более длинной версии с оператором точки, поэтому оператор bang довольно часто используется в предпочтении оператору точки. Также обратите внимание, что более длинная форма используется, когда вам нужно обратиться к элементу, имя которого хранится в переменной, что невозможно с оператором bang:

  Dim strForm As String

  strForm = "MyForm"
  ' This is OK
  Debug.Print Forms(strForm).Controls.Count
  ' This is not
  Debug.Print Forms!strForm.Controls.Count

Кроме того, в коде VBA Microsoft разработала все, чтобы обмануть это различие в формах и отчетах, где раньше было Me! MyFavoriteControl был законным в качестве контрольной ссылки, а Me.MyFavoriteControl был бы законным только как ссылка к настраиваемому свойству (или переменной уровня модуля, которая будет членом объекта). Вы также можете не просто назвать функцию или подменю "MyFavoriteControl", и ее можно было бы назвать оператором точки.

Но с введением VBA MS представила неявно созданные (и поддерживаемые) скрытые оболочки свойств вокруг всех элементов управления, чтобы вы могли использовать оператор точки. Это имело одно огромное преимущество, и это проверка времени контрольных ссылок на компиляцию. То есть, если вы наберете Me.MyFavoriteControl и нет контроля этим именем и никаким другим членом какого-либо типа с этим именем в пространстве имен формы/отчета, тогда вы получите ошибку времени компиляции (действительно, вы бы сообщил об ошибке, как только вы покинули строку кода, где вы сделали ошибку). Итак, если у вас есть этот код:

  Debug.Print Me.Control1

... и вы переименовали Control1 в MyControl, вы получите ошибку при следующем компиляции кода.

Что может быть недостатком проверки времени компиляции? Ну, несколько вещей:

  • код становится сложнее понять в поле зрения программиста. Раньше Me! Reference означало элемент в коллекции по умолчанию формы/отчета (который является объединением коллекций Fields and Controls). Но Me.Reference может быть элементом управления или полем или настраиваемым свойством или публичной переменной уровня модуля или публичной суб-функцией или, или, или... Таким образом, он жертвует мгновенной понятностью кода.

  • вы зависите от неявного поведения VBA и его компиляции. В то время как это обычно хорошо делать (особенно, если вы хорошо заботитесь о своем коде), Компиляция VBA очень сложна и подвержена коррупции. На протяжении многих лет опытные разработчики сообщали, что использование оператора dot делает код более подверженным коррупции, поскольку он добавляет еще один слой скрытого кода, который может выйти из синхронизации с частями приложения, которые вы можете явно изменить.

  • так как вы не можете управлять этими неявными оболочками свойств, когда они идут не так, вам нужно воссоздать объект, несущий модуль, с нуля (обычно SaveAsText достаточно, чтобы очистить коррупцию, не теряя ничего).

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

Это не такая большая жертва, как некоторые могут подумать, если вы используете стандартный набор соглашений об именах. Например, с связанными элементами управления в формах, пусть они используют имена по умолчанию (т.е. Имя поля, к которому привязан элемент управления). Если я не ссылаюсь на элемент управления в коде, я никогда не изменю его имя. Но в первый раз, когда я обращаюсь к нему в коде, я меняю его имя так, чтобы имя элемента управления было отличным от имени поля, к которому оно привязано (это неоднозначность имеет решающее значение в определенных контекстах). Итак, текстовое поле MyField становится txtMyField в то время, когда я решаю ссылаться на него в коде. Единственный раз, когда я когда-либо менял имя поля после написания кода, - это если я почему-то решил, что поле было неправильно. В этом случае достаточно легко найти Find/Replace.

Некоторые утверждают, что они не могут отказаться от Intellisense, но это не так, что вы полностью откажетесь от него, когда используете оператор bang. Да, вы отказываетесь от "действительно умного" Intellisense, то есть версии, которая ограничивает список Intellisense для методов/свойств/членов выбранного объекта, но мне это не нужно - мне нужно Intellisense для сохранения нажатий клавиш, и с помощью Ctrl-SPACEBAR вы получаете полный список Intellisense, который автоматически заполняется так же, как контекстно-зависимая Intellisense, и может затем закоротить печатание.

Другая область путаницы dot/bang - это набор записей DAO в коде VBA, в котором вы используете оператор точек для SQL, который вы используете, чтобы открыть свой набор записей и оператор bang, чтобы ссылаться на поля в результирующем наборе записей:

  Dim rs As DAO.Recordset

  Set rs = CurrentDB.OpenRecordset("SELECT MyTable.MyField FROM MyTable;")
  rs.MoveFirst
  Debug.Print rs!MyField

  rs.Close
  Set rs = Nothing

Если вы помните, какое пространство имен вы работаете, это не так запутанно - точка используется в выражении SQL и в блоке DAO.

Итак, суммируем:

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

  • в формах и отчетах вы используете оператор bang для элементов управления и оператор точки для свойств/методов (хотя вы также можете использовать оператор точки, но это не обязательно целесообразно).

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

  • в SQL, вы можете увидеть используемый оператор bang, но только если есть ссылка на элемент управления в форме или отчете Access, формы "Form! FormName! ControlName" или "Report! ReportName! ControlName".

  • в коде VBA, работающем с наборами записей DAO, вы можете видеть как оператор точки и столбца, так и первый в определении SQL, который используется для открытия набора записей, а последний ссылается на поля в полученном наборе записей один раз он открыт.

Это достаточно сложно для вас?

Ответ 3

Я думаю, что знак esclamation является только обычным разделителем.

В Oracle PL/SQL используется точка:

[Список FETT]. [Поиск FETT]

Любые другие подсказки?!