在Access查询中按ORDER BY多值字段

时间:2015-03-01 20:50:23

标签: sql ms-access union multivalue

介绍我为什么要使用多值字段,如果你愿意可以跳过:我知道多值字段被认为是有害的,但我对它有很好的用处。我有些项目属于A类,有些属于B类,有些属于B类。除了这一个表之外,A类和B类在数据库中的任何地方都没有使用,并且与数据库的其余部分无关,而Access的漂亮复选框/组合框在选择合适的类别时非常漂亮,比任何其他界面更好,我可以用多对多表关系,或简单地有两个单独的字段类别A和类别B(特别是因为它非常罕见,两个类别都有项目)。 / p>

话虽这么说,但我无法得到我想要的结果。我有一个表单,我希望用户能够在组合框中选择项目,我希望它首先显示A类中的所有项目(无论它们是否也属于B类)然后之后才显示所有不属于A类的项目,因为用户更有可能选择A类项目,所以我希望它们更容易被访问。

我无法管理这个。我尝试了ORDER BY,SELECT DISTINCT等各种选项,但我无法找到适用于多值字段的任何东西。然后我尝试执行一个选择所有A类项目的查询,然后选择另一个选择所有非A类项目的查询。这些查询中的每一个都可以自己工作,但Access不会让我们联合起来。

2 个答案:

答案 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

请注意以上内容在查询构建器中的显示方式:

enter image description here

注意上面非常注意如何按照上面的方式扩展mv列颜色。

以上查询的结果如下: enter image description here

注意结果是ONE RECORD(一行)和Colors的多值字段(它们是用户最喜欢的颜色)。

请注意查询构建器中的CLOSE,您会看到该列,但请注意您可以如何选择子列作为“value”(。value)。

因此我们现在在查询构建器中选择它: enter image description here

生成的sql如下所示:

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

结果如下:

enter image description here

注意ONE行如何变为3行。这实际上就像是子表的LEFT连接。这意味着我们可以对此专栏进行排序。

因此,只需构建一个查询,您可以在其中放入.value列,然后可以按照要求对报表中的数据进行排序+分组。

首先应显示所有A类物品,然后显示任何带有其他物品的记录。所以包括.value会爆炸,或“扩展”生成的查询,就好像它是一个单独的表。因此,您可以根据此结果对报告进行排序。