很简单,我在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中查看哪些功能来执行此操作?
答案 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;