2015-03-01 3 views
1

Вступительное слово о том, почему я использую многозначные поля, которые вы можете пропустить, если хотите: я знаю, что многозначные поля считаются вредными, но у меня действительно хорошая используйте для этого. У меня есть элементы, некоторые из которых относятся к категории A, некоторые из них относятся к категории B, а некоторые из них относятся к обоим. Категория A и категория B не используются нигде в базе данных, кроме этой таблицы, и не имеют отношения к остальной части базы данных, а довольно хорошо установлен флажок/combobox доступа для выбора соответствующих категорий, намного лучше, чем любой другой интерфейс Я мог бы сделать с отношением таблицы «многие ко многим» или просто имея два отдельных поля категории «А» и «В» (особенно потому, что очень редко встречаются элементы в обеих категориях).ORDER BY многозначное поле в запросе доступа

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

Мне это не удалось. Я пробовал различные варианты ORDER BY, SELECT DISTINCT и т. П., И я не смог обработать все, что работает для многозначных полей. Затем я попытался выполнить запрос, который выбирает все элементы категории A, а затем другой запрос, который выбирает все элементы, не относящиеся к категории A. Каждый из этих запросов сам по себе работает, но Access не позволит мне СОЕДИНЯТЬ их вместе.

+0

Добро пожаловать в многозначное поле в формате Relational. Если бы мы увидели некоторые запросы, мы могли бы помочь, но ваш вопрос в том виде, в каком он есть, не получит ответа. Покажите нам несколько запросов и, возможно, строку примера. – Namphibian

ответ

2

Рассмотрим таблицу с именем [Поставщик] с данными выборки

ID CompanyName Categories 
-- ----------- ---------------------- 
1 Company 1 Category A 
2 Company 2 Category B 
3 Company 3 Category A, Category B 
4 Company 4 Category B 
5 Company 5 Category A, Category B 

Запрос

SELECT 
    ID, 
    CompanyName, 
    Categories, 
    DCount("*", "Supplier", "ID=" & ID & " AND Categories.Value='Category A'") AS CountCatA 
FROM 
    Supplier 

вернется

ID CompanyName Categories    CountCatA 
-- ----------- ---------------------- --------- 
1 Company 1 Category A      1 
2 Company 2 Category B      0 
3 Company 3 Category A, Category B   1 
4 Company 4 Category B      0 
5 Company 5 Category A, Category B   1 

Таким образом, вместо того, чтобы использовать DCount() для заполнения столбца мы просто используем его в нашем предложении ORDER BY

SELECT 
    ID, 
    CompanyName, 
    Categories 
FROM 
    Supplier 
ORDER BY 
    DCount("*", "Supplier", "ID=" & ID & " AND Categories.Value='Category A'") DESC, 
    ID 

возвращение

ID CompanyName Categories 
-- ----------- ---------------------- 
1 Company 1 Category A 
3 Company 3 Category A, Category B 
5 Company 5 Category A, Category B 
2 Company 2 Category B 
4 Company 4 Category B 

Edit Re: комментарии

Если вы подозреваете, что функция DCount() может замедлить вещи вниз, то вы можете попробовать этот альтернативный подход с использованием SUM() и GROUP BY:

SELECT 
    ID, 
    First(CompanyName_) AS CompanyName, 
    First(Categories_) AS Categories 
FROM 
    (
     SELECT 
      ID, 
      CompanyName AS CompanyName_, 
      Categories AS Categories_, 
      IIf(Categories.Value='Category A',1,0) AS IsPreferredCategory 
     FROM Supplier 
    ) 
GROUP BY ID 
ORDER BY 
    SUM(IsPreferredCategory) DESC, 
    ID 
+0

Это сработало, поэтому я отметил это как ответ, но у меня есть небольшая жалоба на это - это очень медленно. Для моей маленькой таблицы около 100 записей потребовалось несколько секунд, чтобы вычислить запрос. Это не конец света, потому что я не ожидаю, что там будет более 200 записей, но было бы неплохо, если бы было более быстрое решение. – clum

+0

Конечно, лучший способ был бы, если бы мы могли найти способ использования count вместо dcount. – clum

+0

Я обновил свой ответ. –

2

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

Предположим, следующий запрос:

SELECT ID, FirstName, Color FROM customers 
WHERE ID = 4 

Обратите внимание, как приведенные выше выглядит в построителе запросов:

enter image description here

Примечание очень тщательно выше, как мв цвет столбца может быть расширен в соответствии с выше.

Результаты запроса выше, таким образом: enter image description here

Обратите внимание, как результаты являются одна запись, (одна строка) и поле кратного значения цветов (они любимые цвета пользователя).

Обратите внимание, что ЗАКРЫТЬ в построителе запросов вы видите столбец, но обратите внимание, как вы можете выбрать дочерний столбец как «значение» (.value).

Таким образом, мы теперь выбрать это в построитель запросов: enter image description here

Результирующий SQL выглядит следующим образом:

SELECT ID, FirstName, Color.Value FROM customers 
WHERE ID =4 

И результаты этого:

enter image description here

Обратите внимание, как ОДИН ряд стал 3 рядами. Это по сути похоже на LEFT-соединение с дочерней таблицей. И это означает, что мы можем СОРТИРОВАТЬ этот столбец.

Таким образом, просто создайте запрос, в который вы попадаете в столбец .value, и затем вы можете сортировать + группировать эти данные в своем отчете, как вы просили.

Все элементы категории A должны отображаться первыми, а затем любые записи с чем-то другим будут отображаться после. поэтому включение .value будет взорваться или «расширить» полученный запрос, как если бы это была таблица с sepeate. Таким образом, вы можете отсортировать отчет на основе этого результата.

+0

Я действительно пробовал это уже, и проблема в том, что если что-то появляется как в категории 1, так и в категории 2, оно появляется не один раз. Я пробовал выбирать только уникальные значения, но Access не позволяет этого, когда есть многозначные поля. – clum

+0

См. Недавно отредактированный ответ Горда Томпсона, который похож на ваш ответ, но с добавлением поворота, чтобы позаботиться о проблеме, о которой я упоминал. – clum

Смежные вопросы