Значения исчезают при фильтрации коррелированного подзапроса - PullRequest
0 голосов
/ 08 марта 2019

Этот вопрос связан с недавним ответом, который я предоставил здесь .


Настройка

Использование MS Access 2007.

Предположим, яиметь таблицу с именем mytable, состоящую из трех полей:

  • id Long Integer AutoNumber (PK)
  • type Text
  • num LongЦелое число

Со следующими примерами данных:

+----+------+-----+
| id | type | num |
+----+------+-----+
|  1 | A    |  10 |
|  2 | A    |  20 |
|  3 | A    |  30 |
|  4 | B    |  40 |
|  5 | B    |  50 |
|  6 | B    |  60 |
|  7 | C    |  70 |
|  8 | C    |  80 |
|  9 | C    |  90 |
| 10 | D    | 100 |
+----+------+-----+

Аналогично связанному ответу, скажем, я хочу вывести три поля с промежуточной суммой для каждого значения typeсо значением промежуточного итога, ограниченным максимумом 100, я мог бы использовать коррелированный подзапрос, такой как:

select q.* from
(
    select t.id, t.type, t.num, 
        (
            select sum(u.num)
            from mytable u where u.type = t.type and u.id <= t.id
        ) as rt
    from mytable t
) q
where q.rt < 100

. Это дает ожидаемый результат:

+----+------+-----+----+
| id | type | num | rt |
+----+------+-----+----+
|  1 | A    |  10 | 10 |
|  2 | A    |  20 | 30 |
|  3 | A    |  30 | 60 |
|  4 | B    |  40 | 40 |
|  5 | B    |  50 | 90 |
|  7 | C    |  70 | 70 |
+----+------+-----+----+

Наблюдение

Теперь предположим, что я хочу отфильтровать результат, чтобы показать только эти значения для type like "[AB]".

Если я использую один из следующих запросов:

select q.* from
(
    select t.id, t.type, t.num, 
        (
            select sum(u.num)
            from mytable u where u.type = t.type and u.id <= t.id
        ) as rt
    from mytable t
    where t.type like "[AB]"
) q
where q.rt < 100
select q.* from
(
    select t.id, t.type, t.num, 
        (
            select sum(u.num)
            from mytable u where u.type = t.type and u.id <= t.id
        ) as rt
    from mytable t
) q
where q.rt < 100 and q.type like "[AB]"

Результаты фильтруются, как и ожидалось, но значения в столбце rt (промежуточный итог) исчезают:

+----+------+-----+----+
| id | type | num | rt |
+----+------+-----+----+
|  1 | A    |  10 |    |
|  2 | A    |  20 |    |
|  3 | A    |  30 |    |
|  4 | B    |  40 |    |
|  5 | B    |  50 |    |
+----+------+-----+----+

Вопрос

Почему фильтр приведет к исчезновению значений, возвращенных коррелированным подзапросом?


Спасибо заВаше время, читая мой вопрос и заранее за любой совет, который вы можете предложить.

1 Ответ

1 голос
/ 08 марта 2019

Перемещение критериев типов в агрегатный подзапрос работает.

Работает на один уровень меньше, но агрегированный подзапрос должен повторяться в предложении WHERE:

SELECT mytable.*, (select sum(u.num)
            from mytable u where u.type = MyTable.type and u.id <= MyTable.id
        ) AS rt
FROM mytable
WHERE ((((select sum(u.num)
            from mytable u where u.type = MyTable.type and u.id <= MyTable.id
        ))<100) AND ((mytable.[type]) Like "[AB]"));

Версия INNER JOIN:

select MyTable.*, q.* from MyTable INNER JOIN
(
    select t.id, t.type, t.num, 
        (
            select sum(u.num)
            from mytable u where u.type = t.type and u.id <= t.id
        ) as rt
    from mytable t
) q
ON q.id=MyTable.ID
where q.rt < 100 AND MyTable.Type LIKE "[AB]";
...