2017-04-15 48 views
0

我需要一些帮助,以便在MS Access中使用SQL查询执行以下操作。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(表A(行A) - 表B(ROW1)),该表的第二行。将ABSOLUTEVALUE(表A(行A) - 表B(第2行))等等。

2)第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和每行

3的H3的总和)最终步骤:结果

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

而且在最后的步骤中,我们选择从上表中,其中场总计具有最小值的那些A,B &ç行。

谢谢!

+0

数据库是不一个电子表格,并不像一个工作。表格需要通过常用值而不是行位置相关。此外,“名称”是保留字,不应用作字段名称。您应该对数据库设计和规范化进行一些研究,并重新设计您的表格。 – AVG

+0

AVG,虽然它们通常使用不佳,但CROSS JOIN有时仍然是一种适合某种情况的工具。由于这种情况使用这两个表的笛卡尔乘积而不需要排除'WHERE','CROSS JOIN'对于这种情况是理想的。它们通常写成'FROM A,B',尽管有些语言允许'A CROSS JOIN B'。我同意你使用'Name'。尽管我也相信正常化的优势等等,但我不相信这种情况下的表格可以进一步正常化(有时会发生这种情况)。 – toonice

回答

0

对于第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列中选择最小值。

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

进一步阅读

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十字架一般的连接)

+0

非常感谢您的快速和详细的答案! – MrQP

+0

不客气。 – toonice