# Ошибка, отображаемая в нескольких операторах LEFT JOIN Запрос доступа, когда значение должно быть NULL - PullRequest
2 голосов
/ 20 декабря 2009

Я пытаюсь вернуть данные за последние 4 года, если они есть. Таблица (назовите ее A_TABLE) выглядит следующим образом: ID, Год, Val

Идея запроса заключается в следующем: для каждого идентификатора / года в таблице, 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)

Проблема в том, что в прошлые годы, когда нет данных (например, год-1), я вижу «#Error» в соответствующем столбце VAL (например, [VAL-1]). Странно то, что я вижу ожидаемое значение «ноль» в столбце «Год» (например, [ГОД-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

Имеет ли это смысл? Почему я получаю соответствующий NULL val для несуществующих YEAR, но #Error для несуществующих VAL?

(Это Access 2000. Условные операторы типа «IIf (a1.val is null, -999, a1.val)», похоже, ничего не делают.)

РЕДАКТИРОВАТЬ: Оказывается, что ошибки как-то вызваны тем, что A_TABLE на самом деле является запросом. Когда я помещаю все данные в реальную таблицу и выполняю один и тот же запрос, все отображается так, как должно. Всем спасибо за помощь.

Ответы [ 3 ]

0 голосов
/ 20 декабря 2009

Я думаю, что факт, что a_table - это запрос, может иметь значение (см. Мой комментарий к вашему сообщению).

0 голосов
/ 21 мая 2010

У меня была та же проблема, за исключением того, что я делал простое одиночное левое соединение между таблицей и запросом. Поле, к которому я присоединяюсь, было длинным целым числом в таблице, но оно было преобразовано с помощью CLng () в исходном запросе. Левое соединение дало мне проблему #Error. Изменение столбца в таблице на Text и удаление преобразования CLng () решили мою проблему. Я не знаю достаточно о форматах данных MS Access и преобразованиях, чтобы понять, почему это было проблемой. Я использую Access 2003.

0 голосов
/ 20 декабря 2009

Какую версию Access вы используете? Это может быть еще одна странная ошибка в Access. Является ли столбец Val ненулевым? Возможно, Access видит это и делает столбцы Val в ваших результирующих наборах ненулевыми, что приводит к ошибке, когда они оказываются нулевыми.

Может быть, вы просто хотите разобраться с этим условным оператором, чтобы скрыть ошибку:

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

Я думаю, что isnull - это правильный синтаксис для Access, но если это не так, вы понимаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...