【问题标题】:SQL Embedded Select With SUM, slightly restrictedSQL Embedded Select With SUM,略有限制
【发布时间】:2011-06-28 01:14:49
【问题描述】:

我有一个稍微奇怪的问题,我一直在努力解决,我想知道是否有人有任何想法。使它稍微困难的是,它必须在嵌入式产品的受限环境中工作,我只能在加入后更改查询。

我有 2 个表之间的连接以构成完整的行,每行都有一个模块 ID 和一个工作列,其中 0 表示未工作,1 表示工作。每行还有一个配额列,它引用模块 ID,具有相同模块 ID 的所有行具有相同的配额值。

所以例如数据是

ID |Module | Quota | Complete
-------------------------
1  |A      | 1     | 0
2  |B      | 2     | 1
3  |A      | 1     | 0
4  |A      | 1     | 0
5  |B      | 2     | 1
6  |C      | 4     | 0

我想选择模块的完整列的总和小于该模块的配额的记录。

我要去的地方是:

Select table_a.quota, table_a.module, table_b.complete
from table_a inner join table_b on table_a.id = table_b.id
having table_a.quota > (select sum(table_b.complete) from table_a inner join table_b on table_a.id = table_b.id where table_a.module = *module*)

由于我只能在have子句之后影响任何东西,我不知道如何从嵌入语句(module)中的原始查询行中引用模块值,有什么想法吗?

提前感谢任何可以提供帮助的人!

【问题讨论】:

    标签: sql sybase


    【解决方案1】:

    首先请注意,据我所知,您想使用 WHERE 而不是 HAVING;你没有 GROUP BY。

    • WHERE 在所有连接完成后应用,但在任何聚合完成之前。
    • Having 在任何聚合之后应用。

    在引用外部查询方面,在相关子查询内部,您需要使用别名...

    SELECT
      table_a.quota,
      table_a.module,
      table_b.complete
    FROM
      table_a
    INNER JOIN
      table_b
        ON table_a.id = table_b.id
    WHERE
      table_a.quota
      >
      (
        SELECT
          SUM(lookup_b.complete)
        FROM
          table_a AS lookup_a
        INNER JOIN
          table_b AS lookup_b
            ON lookup_a.id = lookup_b.id
        WHERE
          lookup_a.module = table_a.module
      )
    

    【讨论】:

    • 在哪里工作或同时工作,这是 Sybase 的奇怪怪癖之一。这几乎是我一直在尝试的,但我应该说该表在查询的隐藏位中被赋予了一个别名,我无法更改或查看,我不知道该别名是什么
    • 您只需要确保对同一个表的两个引用,并且在同一个范围内,具有不同的别名。您无需更改名称,只需提供别名,这样在引用任一表时都不会产生歧义。
    猜你喜欢
    • 1970-01-01
    • 2017-05-29
    • 2022-12-27
    • 2017-04-22
    • 1970-01-01
    • 2023-02-02
    • 2021-11-26
    • 2021-02-03
    • 2021-06-01
    相关资源
    最近更新 更多