从第二个表访问sql显示值

时间:2015-01-01 16:14:28

标签: sql ms-access

我还在积极学习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值的“强度”。

3 个答案:

答案 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"