介绍我为什么要使用多值字段,如果你愿意可以跳过:我知道多值字段被认为是有害的,但我对它有很好的用处。我有些项目属于A类,有些属于B类,有些属于B类。除了这一个表之外,A类和B类在数据库中的任何地方都没有使用,并且与数据库的其余部分无关,而Access的漂亮复选框/组合框在选择合适的类别时非常漂亮,比任何其他界面更好,我可以用多对多表关系,或简单地有两个单独的字段类别A和类别B(特别是因为它非常罕见,两个类别都有项目)。 / p>
话虽这么说,但我无法得到我想要的结果。我有一个表单,我希望用户能够在组合框中选择项目,我希望它首先显示A类中的所有项目(无论它们是否也属于B类)然后之后才显示所有不属于A类的项目,因为用户更有可能选择A类项目,所以我希望它们更容易被访问。
我无法管理这个。我尝试了ORDER BY,SELECT DISTINCT等各种选项,但我无法找到适用于多值字段的任何东西。然后我尝试执行一个选择所有A类项目的查询,然后选择另一个选择所有非A类项目的查询。这些查询中的每一个都可以自己工作,但Access不会让我们联合起来。
答案 0 :(得分:2)
考虑一个名为[Supplier]的表,其中包含样本数据
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
修改评论<评论
如果您怀疑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
答案 1 :(得分:2)
请记住,大多数多值数据库系统都能够执行所谓的爆炸选择或排序。原来Access也有这种能力。
假设以下查询:
SELECT ID, FirstName, Color FROM customers
WHERE ID = 4
请注意以上内容在查询构建器中的显示方式:
注意上面非常注意如何按照上面的方式扩展mv列颜色。
以上查询的结果如下:
注意结果是ONE RECORD(一行)和Colors的多值字段(它们是用户最喜欢的颜色)。
请注意查询构建器中的CLOSE,您会看到该列,但请注意您可以如何选择子列作为“value”(。value)。
因此我们现在在查询构建器中选择它:
生成的sql如下所示:
SELECT ID, FirstName, Color.Value FROM customers
WHERE ID =4
结果如下:
注意ONE行如何变为3行。这实际上就像是子表的LEFT连接。这意味着我们可以对此专栏进行排序。
因此,只需构建一个查询,您可以在其中放入.value列,然后可以按照要求对报表中的数据进行排序+分组。
首先应显示所有A类物品,然后显示任何带有其他物品的记录。所以包括.value会爆炸,或“扩展”生成的查询,就好像它是一个单独的表。因此,您可以根据此结果对报告进行排序。