访问 sql 显示第二个 table 的值

Access sql display values from second table

我仍在积极学习 MS Access/sql(需要与 Office 2003 兼容)。我已经尽可能地简化了事情。

我有以下 table(主要),包括 2 个字段(Ax 和 Ay),并且扩展到数千条记录。 这是主数据库,需要可搜索:

table: 主要

Ax  Ay
1   6
5   9
3   3
    7
5   5
7   2
2   
4   4
    3
6   5
7   6

等等.... 上面的空白条目只是空值。 Ax 和 Ay 值可以出现在任一字段中。

还有一个名为 Afull 的第二个 table,它包含 2 个名为 Avalid 和 Astr 的字段:

table: 满

Avalid  Astr
1
2
3
4
5
6
7
8
9

Field Astr 在每次运行开始时被初始化为 Null。

此 table 的第一个用途是将 Ax 和 Ay 的所有有效值存储在字段 Avalid 中。 第二个用途是允许用户选择搜索条件。为此,将 table Afull 添加为用户搜索表单中的子表单。然后,用户通过在要搜索的值旁边的 Astr 中输入任何 >0 的值来选择要搜索的有效值。

然后构建一个 sql 查询字符串,其目的是 return 所有记录携带任何 'permutation' 用户选择的有效值:

SELECT Main.Ax,Main.Ay
FROM Main
WHERE (Main.Ax In(uservalues) OR Main.Ax Is Null) AND (Main.Ay In(uservalues) OR Main.Ay Is Null)

"uservalues" 转换为要搜索的有效值列表。 这很好并且按预期工作(不存在双 Null 记录)。

问题: 我想在结果中包含 Astr 值本身——一个字段用于 Ax Astr 值,一个字段用于 Ay Astr 值。我尝试了一些方法,包括将以下内容添加到 SELECT 语句中:

strSQL = strSQL & ",IIF((Main.Ax In(uservalues)),Afull.Astr AS Axstr"
strSQL = strSQL & ",IIF((Main.Ay In(uservalues)),Afull.Astr AS Aystr"
strSQL = strSQL & "FROM Main,Afull"

...但这不起作用。有没有相对简单的方法来实现这一目标?

最终,我还将使用 Astr 值进行升序排序。将 Astr 视为所选有效值的 'strength'。

换句话说,用户可以 select Ax 和 Ay 的值,而您只想 return 记录 Ax 和 Ay 都在 selected 值列表中的值或者其中一个可以为空,但不能同时为空。

现在您想为 Ax 和 Ay 添加 Astr。您可以使用如下所示的相关子查询,或者您可以加入 Afull 两次,一次在 Ax = Avalid 上,一次在 Ay = Avalid 上。

如果您要像示例中那样构建 SQL 字符串,请同时检查括号。

SELECT 
    Main.Ax,
    Main.Ay,
    (select Astr from Afull where Avalid = Main.Ax) as AxStr,
    (select Astr from Afull where Avalid = Main.Ay) as AyStr
FROM Main
WHERE (Main.Ax In(uservalues) OR Main.Ax Is Null) 
AND (Main.Ay In(uservalues) OR Main.Ay Is Null)

谢谢你,GB,非常感谢并且工作完美。问题中缺少右括号也已修复,并且 Axstr Aystr --> 改进了可读性 AxStr AyStr 指出(突出显示强度方面)。

SELECT 语句的扩展,用于获取 AxStr+AyStr 的总和,即 ,AxStr+AyStr as TOTAL 仅当各自的 Main.Ax 和 Main.Ay 都具有非 Null 值时才有效。

由于 Main table 中允许使用 Null 值,因此我扩展了 SELECT 语句以获得 AxStr+AyStr 的总和,如下所示:

strSQL = strSQL & ",IIF(AxStr>0 AND AyStr>0,AxStr+AyStr,IIF(Main.Ax Is Null,AyStr,
                    IIF(Main.Ay Is Null,AxStr,0))) AS AStrTOTAL"

无论在一天结束时什么都有效,但这里有一个替代方案,基本上它选择第一个计算结果为真的表达式的值。如果 A?Str 为空或小于零,它使用零值,以便您可以将两个结果加在一起。

Switch(AxStr>=0, AxStr,AxStr<0,0,isnull(AxStr),0) + Switch(AyStr>=0, AyStr,AyStr<0,0,isnull(AyStr),0)