访问 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)
我仍在积极学习 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)