Хотя сокращенные доменные функции, такие как DLookup, заманчивы, у них есть свои недостатки. Эквивалентный Jet SQL что-то вроде
SELECT FIRST(island)
FROM villages
WHERE village = ?;
Если у вас есть более одного подходящего кандидата, он выберет «первый», определение «первого» зависит от реализации (механизма SQL) и не определено для движка Jet/ACE IIRC. Вы знаете, кто из них будет первым? Если нет, то держитесь подальше от DLookup :)
[Для интереса ответом для Jet/ACE будет либо минимальное значение, основанное на кластеризованном индексе на момент последнего сжатия файла базы данных, либо первое (допустимое время) вставленное значение, если база данных никогда не уплотнялась. Кластеризованный индекс, в свою очередь, определяется PRIAMRY KEY, если он присутствует, в противном случае ограничение UNIQUE или индекс, определенный для столбцов NOT NULL, в противном случае - первая (действительная по времени) вставленная строка. Что если для столбцов NOT NULL определено более одного ограничения или индекса UNIQUE, какой из них будет использоваться для кластеризации? Я понятия не имею! Надеюсь, вы понимаете, что «первый» определить непросто, даже если вы знаете, как это сделать!]
Я также видел совет от Microsoft избегать использования агрегатных функций домена с точки зрения оптимизации:
Информация о производительности запросов в базе данных Access http://support.microsoft.com/kb/209126
«Избегайте использования агрегатных функций домена, таких как функция DLookup... ядро базы данных Jet не может оптимизировать запросы, использующие агрегатные функции домена».
Если вы решите переписать с помощью запроса, вы можете воспользоваться синтаксисом PARAMETERS, или вы можете предпочесть синтаксис Jet 4.0/ACE PROCEDURE, например. что-то типа
CREATE PROCEDURE GetUniqueIslandName
(
:village_name VARCHAR(60)
)
AS
SELECT V1.island_name
FROM Villages AS V1
WHERE V1.village_name = :village_name
AND EXISTS
(
SELECT V2.village_name
FROM Villages AS V2
WHERE V2.village_name = V1.village_name
GROUP
BY V2.village_name
HAVING COUNT(*) = 1
);
Таким образом, вы можете использовать собственные функции движка — или, по крайней мере, его поставщиков данных — для экранирования всех символов (а не только двойных и одинарных кавычек) по мере необходимости.
person
onedaywhen
schedule
14.10.2008