当过滤相关的子查询时,值消失了



这个问题与我在这里提供的最新答案有关。


设置

使用MS Access2007。

假设我有一个名为mytable的表,该表由三个字段组成:

  • id长整数自动化器(PK)
  • type文本
  • num长整数

使用以下示例数据:

+----+------+-----+
| 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 |    |
+----+------+-----+----+

问题

为什么过滤器会导致相关子查询返回的值消失?


感谢您的时间阅读我的问题,并提前提供任何建议。

将类型标准移至汇总子查询作品。

少级工作起作用,但汇总子查询必须在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]"));

内部联接版本:

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]";

相关内容

  • 没有找到相关文章

最新更新