SQL MS ACCESS:表和筛选结果之间的选择性操作



我需要一些帮助才能使用 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 交叉联接上)

最新更新