MS Access SQL:枚举多对一关系的结果

时间:2014-07-09 10:36:22

标签: sql ms-access

很简单,我在MS Access中设置了多对一关系表,我设法将不同的值作为单独的行提取出来。我现在需要枚举这些行。

查询如下所示(由MS Access Designer生成 - 为格式化道歉):

SELECT DISTINCT ValidationRule.ValidationCode AS Rule, Table.Template AS Template
FROM ValidationRule RIGHT JOIN (([Table] INNER JOIN TableVersion ON Table.TableID = TableVersion.TableID) INNER JOIN ValidationScope ON TableVersion.TableVID =   ValidationScope.TableVID) ON ValidationRule.ValidationId = ValidationScope.ValidationID
GROUP BY ValidationRule.ValidationCode, Table.Template
ORDER BY ValidationRule.ValidationCode;

所以我的数据如下:

Rule     Template
v0007_m   C 00.01
v0189_h   C 01.00
v0189_h   C 05.01
v3000_i   C 08.00

我需要在结果中添加顺序值,如下所示:

Rule     Template   Sequence
v0007_m   C 00.01   1
v0189_h   C 01.00   1
v0189_h   C 05.01   2 
v3000_i   C 08.00   1

我应该在MS Access SQL中查看哪些功能来执行此操作?

2 个答案:

答案 0 :(得分:1)

如果您将查询保存为一个名为qryValdationRule的单独查询,那么这个构建的查询应该可以满足您的需求:

SELECT qryValidationRule.Rule, qryValidationRule.Template, DCount("*", 'qryValidationRule', "[Rule] = '" & qryValidationRule.Rule & "' AND [Template] <= '" & qryValidationRule.Template & "'") AS Sequence
FROM qryValidationRule
ORDER BY qryValidationRule.Rule, qryValidationRule.Template;

我们正在查找并获取具有相同规则值的所有记录的计数,并且数据集中的模板值相等或更少。这基本上为我们提供了按规则分组的序列。只有当模板值在规则组之间不同时才能正常工作,这应该是这种情况,因为您在表的CROSS JOIN中提取了DISTINCT。它不像窗口功能那样方便或灵活,但可以满足您的需求。

您可能还想尝试这种方法,这可能更有效:

SELECT t1.Rule, t1.Template, COUNT(t2.Template) AS Sequence
FROM qryValidationRule AS t1 INNER JOIN qryValidationRule AS t2 ON t1.Rule = t2.Rule AND t1.Template >= t2.Template
GROUP BY t1.Rule, t1.Template
ORDER BY t1.Rule, t1.Template;

编辑:添加了另一种查找相同数据的方法;由于JOINing与子查询的关系,可能会更高效。

答案 1 :(得分:0)

使用:计数(*)AS序列

SELECT DISTINCT ValidationRule.ValidationCode AS Rule, Table.Template AS Template, Count(*) AS Sequence
FROM ValidationRule RIGHT JOIN (([Table] INNER JOIN TableVersion ON Table.TableID =     TableVersion.TableID) INNER JOIN ValidationScope ON TableVersion.TableVID =       ValidationScope.TableVID) ON ValidationRule.ValidationId = ValidationScope.ValidationID
GROUP BY ValidationRule.ValidationCode, Table.Template
ORDER BY ValidationRule.ValidationCode;