我还在积极学习MS Access / sql(需要符合Office 2003标准)。我尽可能简化了事情。
我有下表(Main),包括2个字段(Ax和Ay),并扩展到数千条记录。 这是主数据库,需要可搜索:
表:主要
Ax Ay
1 6
5 9
3 3
7
5 5
7 2
2
4 4
3
6 5
7 6
等.... 上面的空白条目只是空值。 Ax和Ay值可以出现在任一字段中。
还有一个名为Afull的第二个表,它包含两个名为Avalid和Astr的字段:
表:Afull
Avalid Astr
1
2
3
4
5
6
7
8
9
Field Astr在每次运行开始时初始化为Null。
此表的第一个用途是在字段Avalid中存储Ax和Ay的所有有效值。 第二种用途是允许用户选择搜索标准。为此,将表Afull添加为用户搜索表单中的子表单。然后,用户通过在要搜索的值旁边输入任何值> 0到Astr来选择要搜索的Avalid值。
然后构建一个sql查询字符串,其目的是返回所有带有用户选择的Avalid值的“排列”的记录:
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”被转换为要搜索的Avalid值列表。 这很好并按预期工作(不存在双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值对Ascending进行排序。将Astr视为所选Avalid值的“强度”。
答案 0 :(得分:1)
稍微解释一下,用户可以选择Ax&的值。 Ay和你只想返回斧头和斧头的记录。 Ay位于所选值的列表中,或者它们中的任何一个都可以为null,但不能同时为两者。
现在你要为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)
答案 1 :(得分:1)
无论什么在一天结束时都有用,但这里有一个替代方案,基本上它选择第一个表达式的值来评估true。如果A?Str为null或小于零,则使用零值,这样您就可以将两个结果一起添加。
Switch(AxStr>=0, AxStr,AxStr<0,0,isnull(AxStr),0) + Switch(AyStr>=0, AyStr,AyStr<0,0,isnull(AyStr),0)
答案 2 :(得分:0)
谢谢你,GB,非常感谢并且工作得很好。在问题中缺少右括号也固定,而Axstr Aystr - &gt;提高可读性AxStr AyStr指出(突出强度方面)。
SELECT语句的扩展,以获取AxStr + AyStr的总数,即,AxStr+AyStr as TOTAL
仅当相应的Main.Ax和Main.Ay都具有非Null值时才有效。
由于Null值在Main表中是允许的,因此我扩展了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"