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

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

[FETT List]![FETT Search]
  1. Список FETT является таблицей
  2. Поиск FETT является столбцом в Списке FETT

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

Спасибо

14
задан ChickSentMeHighE 21 July 2010 в 17:42
поделиться

3 ответа

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

10
ответ дан 1 December 2019 в 09:12
поделиться

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

Изначально я планировал объяснить, что если бы вы сказали, что ссылка была [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;

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

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

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

Это для 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.

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

Forms! MyForm также эквивалентен Forms.Item ("MyForm"), поэтому сверхдлинной формой будет Forms.Items ("MyForm"). Controls ("MyControl"). Обратите внимание, что оператор взрыва является ярлыком для более длинной версии формы с оператором точки, поэтому оператор взрыва довольно часто используется вместо оператора точки. Также обратите внимание, что более длинная форма в конечном итоге используется, когда вам нужно обратиться к элементу, имя которого хранится в переменной, что невозможно с оператором 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, вы бы получили ошибку при следующей компиляции кода.

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

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

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

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

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

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

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

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

  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.

Итак, подведем итог:

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

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

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

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

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

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

19
ответ дан 1 December 2019 в 09:12
поделиться

Я думаю, что восклицательный знак - это только условный разделитель.

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

[FETT List].[FETT Search]

Есть еще подсказки?!

0
ответ дан 1 December 2019 в 09:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: