SQL MS ACCESS:表与过滤结果之间的选择性操作

SQL MS ACCESS: selective operations between tables and filtering results

我需要一些帮助才能使用 SQL 查询在 MS Access 中执行以下操作。

我想执行的操作如下例所示:

初始tables

TABLE一个

Name H1 H2 H3
A    5  10 5
B    1  2  3
C    7  3  1

TABLE乙:

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

因此,这个新的 table 的第一行计算为 ABSOLUTEVALUE( TABLE A (row A)-TABLE B(row1)),第二行这个 table 将是 ABSOLUTEVALUE( TABLE A (row A)-TABLE 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

所以在这一步中,我需要添加一个字段,该字段计算为每行的值 H1、H2 和 H3 的总和

3) 最后一步:结果

Name    H1  H2  H3
 A      3   8   3
 B      1   0   1
 C      5   1   1

在最后一步中,我们 select 前一个 table 中字段 Total 具有最小值的 A、B 和 C 行。

谢谢!

对于第 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 的评论,这种情况使用了两个 table 的笛卡尔积,这是第一个 table 中的每条记录与第二个中的每条记录相连接的地方table。这可以通过执行 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

(请注意,当一个字段连接到另一个 table 并且它的名称在另一个 table 中不存在时,您将能够仅通过其名称继续引用它无需指定 table 名称(但如果您愿意,您仍然可以这样做)。如果新字段确实与另一个 table 中的字段共享一个名称,则 each 字段需要通过 table 名称和字段名称来引用。)

此数据集可用于所有三个任务。

对于第一个任务,ABS() 函数可用于 H1 值之间的差异等。请注意,如果您生成一个字段,例如使用 ABS( A.H1 - B.H1 ),并且不要使用 AS 为其命名,然后新字段将被任意指定一个名称,该名称通常是生成该字段的表达式(在本例中为 ABS( A.H1 - B.H1 ))或其他难以使用的名称。因此,如果您打算在等式的其他部分(或其他地方)引用它们,强烈建议您命名所有生成的字段。

对于第二个任务,只需将计算的 H 字段相加的表达式(例如 H1 + H2 + H3)就足够了。

对于第三个任务,我们可以使用第一个任务中生成的数据集,但没有 NameB 列。然后我们可以按 NameA 的值将行分组在一起,并使用聚合函数 MIN() 从每个 H 列中选择最小值。

如果您有任何问题或意见,请随时post发表相应的评论。

进一步阅读

How to include this SQL subquery for absolute number's value?(在 ABS() 上)

How to use cross join in access?(在 Access 中使用 CROSS JOIN

http://www.w3resource.com/sql/joins/cross-join.php(关于 SQL 一般交叉连接)