Непустые строки справа от LEFT JOIN

qwrqwr
Дата: 06.11.2009 10:33:42
Всем привет.
Вчера натолкнулся на странную вещь - попытаюсь воспроизвести упрощенно:

Предисловие:
Как всем известно, любая операция с Нулл должна давать также Нулл.
Также известно, что Акцесс конкатенируя Нуллы со строками через "&" дает на выходе строку, а не Нулл (об этом даже в FAQ есть).
Теперь грабли :)

1. Табличка Cities
citypopul
Гадюкино дер100
Москва5000
Питер4000
Простоквашино дер123

2. Табличка Districts
cityDistrictDistr_popul
Другой_городвв0
Другой_городфф0
Другой_городыы0
МоскваБирюлево1000
МоскваБутово500
МоскваТаганка3500
ПитерДворцовый2000
ПитерЛитейный2000

Запрос Query2, чтобы собрать строку город+район:
SELECT D.city, D.city & " (" & D.District & ")" AS nm, D.Distr_popul & " чел." AS dp
FROM Cities AS C 
INNER JOIN Districts AS D 
ON C.city = D.city;
citynmdp
МоскваМосква (Бирюлево)1000 чел.
МоскваМосква (Бутово)500 чел.
МоскваМосква (Таганка)3500 чел.
ПитерПитер (Дворцовый)2000 чел.
ПитерПитер (Литейный)2000 чел.
(В запросе сделан джойн на таблицу Cities, чтобы отсечь "Другой_город" - это его единственное предназначение здесь)

Запрос Query3, чтобы собрать население деревень в 1 строку (в реальности, конечно, отбор не по Like "* дер", а по признаку - но тут это не важно):
SELECT city, popul
  FROM Cities
 WHERE city Not Like "* дер"
UNION ALL 
SELECT "деревни", Sum(popul)
  FROM Cities
 WHERE city Like "* дер";
citypopul
Москва5000
Питер4000
деревни223

Теперь самое смешное:
SELECT Query3.city, Query3.popul, Query2.nm, Query2.dp
FROM Query3 
LEFT JOIN Query2 
ON Query3.city = Query2.city;
выдает:
citypopulnmdp
Москва5000Москва (Таганка)3500 чел.
Москва5000Москва (Бутово)500 чел.
Москва5000Москва (Бирюлево)1000 чел.
Питер4000Питер (Дворцовый)2000 чел.
Питер4000Питер (Литейный)2000 чел.
деревни223 () чел.

вместо ожидаемых двух Нуллов в последней строке

Разворот "в один запрос" - ничего не меняет.
(В принципе, также можно обойтись и без джойна на таблицу Cities в запросе Query2 - но это тоже ничего не меняет:
SELECT Q3.city, Q3.popul, Q2.nm, Q2.dp
FROM (SELECT city, popul
     FROM Cities
    WHERE city Not Like "* дер"
  UNION ALL 
   SELECT "Деревни", Sum(popul)
     FROM Cities
    WHERE city Like "* дер") AS Q3 
LEFT JOIN
  (SELECT D.city, D.city & " (" & D.District & ")" as nm, D.Distr_popul & " чел." as dp
     FROM Districts AS D) AS Q2 
ON Q3.city = Q2.city;

Разумеется, ситуацию я исправил, заменив конкатенацию "&" на "+".
(Делал вчера, и надо было сделать быстро)
Но "осадок остался" :) - и решил запостить тут для обсуждения.

Все-таки интересно - это глюк Акцесса или этому есть какое-то оправдание с т.зр. синтаксиса SQL ??