Всем привет.
Вчера натолкнулся на странную вещь - попытаюсь воспроизвести упрощенно:
Предисловие:Как всем известно, любая операция с Нулл должна давать также Нулл.
Также известно, что Акцесс конкатенируя Нуллы со строками через "&" дает на выходе строку, а не Нулл (об этом даже в FAQ есть).
Теперь грабли :)
1. Табличка Cities
city | popul | Гадюкино дер | 100 | Москва | 5000 | Питер | 4000 | Простоквашино дер | 123 |
|
2. Табличка Districts
city | District | Distr_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;
city | nm | dp | Москва | Москва (Бирюлево) | 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 "* дер";
city | popul | Москва | 5000 | Питер | 4000 | деревни | 223 |
|
Теперь самое смешное:
SELECT Query3.city, Query3.popul, Query2.nm, Query2.dp
FROM Query3
LEFT JOIN Query2
ON Query3.city = Query2.city;
выдает:
city | popul | nm | dp | Москва | 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 ??