我需要一些帮助才能使用 SQL 查询在 MS Access 中执行以下操作。
以下示例说明了我想执行的操作:
初始表
表 A
Name H1 H2 H3
A 5 10 5
B 1 2 3
C 7 3 1
表 B:
Name H1 H2 H3
1 1 1 1
2 2 2 2
1) 第一步:结果
NAME TABLE A NAME TABLE B H1 H2 H3
A 1 4 9 4
A 2 3 8 3
B 1 0 1 2
B 2 1 0 1
C 1 6 2 0
C 2 5 1 1
因此,这个新表的第一行计算为 ABSOLUTEVALUE( TABLE A (行 A)-表 B(Row1)),此表的第二行将是 ABSOLUTEVALUE( TABLE A (row A)-表 B(Row2)) 依此类推。
2)第二步:结果
NAME TABLE A NAME TABLE B H1 H2 H3 Total
A 1 4 9 4 17
A 2 3 8 3 14
B 1 0 1 2 3
B 2 1 0 1 2
C 1 6 2 0 8
C 2 5 1 1 7
所以在此步骤中,我需要添加一个字段 whis 计算为每行的值 H1、H2 和 H3 的总和
3) 最后一步:结果
Name H1 H2 H3
A 3 8 3
B 1 0 1
C 5 1 1
在最后一步中,我们从上表中选择那些 A、B 和 C 行,其中字段 Total 具有最小值。
谢谢!
对于第 1 步,请尝试...
SELECT A.NameA AS [NAME TABLE A],
B.NameB AS [NAME TABLE B],
ABS( A.H1 - B.H1 ) AS H1,
ABS( A.H2 - B.H2 ) AS H2,
ABS( A.H3 - B.H3 ) AS H3
FROM A,
B;
对于第 2 步,请尝试...
SELECT A.NameA AS [NAME TABLE A],
B.NameB AS [NAME TABLE B],
ABS( A.H1 - B.H1 ) AS H1,
ABS( A.H2 - B.H2 ) AS H2,
ABS( A.H3 - B.H3 ) AS H3,
H1 + H2 + H3 AS [Total]
FROM A,
B;
对于第 3 步,请尝试以下任一操作...
SELECT A.NameA AS [NAME TABLE A],
MIN( ABS( A.H1 - B.H1 ) ) AS H1,
MIN( ABS( A.H2 - B.H2 ) ) AS H2,
MIN( ABS( A.H3 - B.H3 ) ) AS H3
FROM A,
B
GROUP BY A.NameA;
根据我对AVG的评论,这种情况使用两个表的笛卡尔积,即第一个表中的每条记录都连接到第二个表中的每条记录。 这可以通过执行CROSS JOIN
来实现,就像我在每个发言中放置FROM A, B
一样。 此联接为我们提供了以下数据集...
NameA | A.H1 | A.H2 | A.H3 | NameB | B.H1 | B.H2 | B.H3
------|------|------|------|-------|------|------|-----
A | 5 | 10 | 5 | 1 | 1 | 1 | 1
A | 5 | 10 | 5 | 2 | 2 | 2 | 2
A | 5 | 10 | 5 | 1 | 1 | 1 | 1
A | 5 | 10 | 5 | 2 | 2 | 2 | 2
A | 5 | 10 | 5 | 1 | 1 | 1 | 1
A | 5 | 10 | 5 | 2 | 2 | 2 | 2
(请注意,当一个字段连接到另一个表并且它的名称在该另一个表中不存在时,您将能够继续仅通过其名称引用它,而无需指定表名称(尽管如果您愿意,您仍然可以这样做)。 如果新字段确实与其他表中的字段共享名称,则需要同时引用表名和字段名来引用每个字段。
此数据集可用于所有三个任务。
对于第一个任务,ABS()
函数可用于 H1 值之间的差异等。 请注意,如果您生成一个字段,例如ABS( A.H1 - B.H1 )
,并且不使用AS
为其命名,则新字段将被任意赋予一个名称,这通常是生成字段的表达式(在这种情况下ABS( A.H1 - B.H1 )
)或其他笨拙的东西。 因此,如果您打算在等式的其他部分(或其他地方)引用所有生成的字段,强烈建议您命名它们。
对于第二个任务,只需将计算H
字段(如H1 + H2 + H3
)相加即可。
对于第三个任务,我们可以使用第一个任务中生成的数据集,没有NameB
列。 然后我们可以按NameA
的值将行分组在一起,并使用聚合函数MIN()
从每列H
中选择最小值。
如果您有任何问题或意见,请随时发表相应的评论。
延伸阅读
如何将这个SQL子查询包含绝对数的值?(ABS()
)
如何在访问中使用交叉联接?(在 Access 中使用CROSS JOIN
时)
http://www.w3resource.com/sql/joins/cross-join.php(一般在 SQL 交叉联接上)