多个LEFT JOIN语句中出现#Error当值应为NULL时访问查询

时间:2009-12-20 00:35:44

标签: sql ms-access

我正在尝试返回ID过去4年的数据,如果存在的话。该表(称为A_TABLE)如下所示:ID,Year,Val

查询背后的想法是这样的:对于表中的每个ID /年,LEFT JOIN与Year-1,Year-2和Year-3(获得4年的数据)然后返回Val每年。这是SQL:

SELECT a.ID, a.year AS [Year], a.Val AS VAL, 
  a1.year AS [Year-1], a1.Val AS [VAL-1], 
  a2.year AS [Year-2], a2.Val AS [VAL-2], 
  a3.year AS [Year-3], a3.Val AS [VAL-3]
FROM (
  ([A_TABLE] AS a 
  LEFT JOIN [A_TABLE] AS a1 ON (a.ID = a1.ID) AND (a.year = a1.year+1)) 
  LEFT JOIN [A_TABLE] AS a2 ON (a.ID = a2.ID) AND (a.year = a2.year+2)) 
  LEFT JOIN [A_TABLE] AS a3 ON (a.ID = a3.ID) AND (a.year = a3.year+3)

问题在于,在没有数据的过去几年(例如,Year-1),我在相应的VAL列中看到“#Error”(例如,[VAL-1])。奇怪的是,我在Year列中看到了预期的“null”(例如,[YEAR-1])。

一些示例数据:

ID     YEAR  VAL
Dave   2004  1
Dave   2006  2
Dave   2007  3
Dave   2008  5
Dave   2009  0

这样的输出:

ID    YEAR  VAL  YEAR-1  VAL-1  YEAR-2  VAL-2  YEAR-3  VAL-3
Dave  2004  1            #Error         #Error         #Error
Dave  2006  2            #Error 2004    1              #Error
Dave  2007  3    2006    2              #Error 2004    1
Dave  2008  5    2007    3      2006    2              #Error
Dave  2009  0    2008    5      2007    3      2006    2

这有意义吗?为什么我为不存在的YEAR获得了适当的NULL值,而对于不存在的VAL则为#Error?

(这是Access 2000.像“IIf(a1.val是null,-999,a1.val)”这样的条件语句似乎没有做任何事情。)

编辑:事实证明,错误是由A_TABLE实际上是一个查询的事实引起的。当我将所有数据放入实际表并运行相同的查询时,所有内容都会显示出来。感谢大家的帮助。

3 个答案:

答案 0 :(得分:0)

您使用的是什么版本的Access?这可能是Access的另一个奇怪的怪癖/错误。 Val列是非空的吗?也许Access正在看到这一点,并使结果集中的Val列为非null,这会在结果为null时产生错误。

也许您只想用条件语句来处理它以隐藏错误:

SELECT a.ID, a.year AS [Year], iif(isnull(a.year),0,a.Val) AS VAL...

我认为isnull是Access的正确语法,但如果不是,那么你就明白了。

答案 1 :(得分:0)

我认为a_table是一个查询的事实可能很重要(请参阅我对你帖子的评论)。

答案 2 :(得分:0)

我遇到了同样的问题,除了我在表和查询之间做了一个非常基本的单一左连接。我加入的字段是表中的Long Integer,但它是在原始查询中使用CLng()转换的。左连接给了我#Error问题。将表中的列更改为Text并删除CLng()转换解决了我的问题。我对MS Access数据格式和转换知之甚少,不知道为什么这是一个问题。我正在使用Access 2003。