У меня есть две таблицы. Виджеты, в которых есть информация о каждом виджете (Цвет, размер и т. Д.); каждый виджет имеет уникальный идентификатор, WidgetID.
Другая таблица - это тесты, и в ней содержится информация о нескольких тестах, которые были запущены для каждого виджета. Следовательно, эта таблица имеет несколько строк для каждого WidgetID. Он содержит информацию, которую мы можем назвать (WidgetID, Date, Param1, Param2 и т. Д.); тестовая информация.
Я написал запрос, который находит для каждого WidgetID последние два теста по дате. SQL выглядит следующим образом:ms доступ к сложному запросу. запрос последних двух записей по дате для каждого идентификатора. очень медленно
ВЫБРАТЬ Widgets.WidgetID, Widgets.Color, Widgets.Size, T.Date, T.Param1, T.Param2 *
ОТ Tests AS T INNER JOIN Widgets ON T.WidgetID = Widgets.WidgetID
WHERE (((Выберите COUNT (*) FROM Тесты
ГДЕ WidgetID = T.WidgetID AND Date> T.Date)) < 2);
Это работает очень хорошо. Однако это дает мне слишком много виджетов. Я создал запрос, который фильтрует виджеты под названием WidgetFilter. Это в основном просто выбирает те, которые я хочу, основываясь на том, что я выбираю. Идея заключалась в том, что я бы выполнил тот же запрос, заменив «Виджеты» в коде выше с помощью «WidgetFilter». Однако, когда я это делаю, это происходит навсегда. На самом деле, он просто замерзает. Я оставил его на полтора часа, и он просто сидел там, и я должен был удалить ctl. Моя единственная мысль состоит в том, что он запрашивает запрос WidgetFilter для каждой строки тестов (и это много строк). Я также попытался применить критерии фильтра в исходном запросе. Я получаю тот же результат.
Есть ли лучший способ сделать это? Либо один запрос, который делает все это и, возможно, даже не выглядит так или что я думал, так это то, что должен быть способ запуска запроса WidgetFilter один раз и заставить эти данные обращаться к таблице как таковой (не существует такой вещи, как временная таблица). Таким образом, он не запускает WidgetFilter для каждого элемента в тестах.
EDIT:
WidgetFilter на самом деле довольно сложный. Я создал эти таблицы выбора GUI, где пользователь видит два столбца. Выбор слева и список, который он создает справа и посередине, - кнопка добавления и кнопка удаления. Затем они вызывают отчет, который выполняет WidgetFilter, yadda yadda yadda. В любом случае, когда пользователь добавляет элемент, он добавляет этот элемент в таблицу. Итак, для категории Widget, Color, появится таблица ColorList. Пользователь создает этот список через gui. Есть три из этих guis (Цвет, Размер, Тип). Для каждого из них есть таблица, и тогда существует глобальное логическое (например, ColorFlag), которое сообщает, какой фильтр использовать (цвет, размер или тип).
Так, в запросе WidgetFilter критерии боксировать под цвет будет иметь это:
В (Выбрать цвет От ColorList)
и есть выражение колонки Expr1: getColorFlag(), который представляет собой модуль, который возвращает значение из Глобальная переменная ColorFlag. и в то же время применяется таблица цветов. Итак, когда все сказано и сделано, есть три ряда критериев. Код выглядит следующим образом:
Выберите Widgets.WidgetID, Widgets.Color, Widgets.Size, Widgets.Type
От Виджеты
WHERE (getColorFlag() = True И (Widgets.Color) В (Выбрать цвет FROM ColorList))
ИЛИ (getSizeFlag() = True И (Widgets.Size) В (Выбрать размер от SizeList))
ИЛИ (getTypeFlag() = True И (Widgets.Type) В (Выберите тип ОТ TypeList))
Я проверил ... это было не так. нет нулевых значений. Спасибо хоть. – Matt