1

我有两张桌子

  • 包表:packageid、数量
  • 交易表:transactionid、packageid、数量

每当获得“ package”时,都会在“ ”表中创建一个条目transactions,以及获得的数量。可以执行多个' transactions',并且当完全获得包裹时,该包裹的所有交易的总和应该等于包裹表中该包裹的数量。

我想写一个 SQL 语句来检查一个特定的 packageid 是否没有被完全获取,即:

  1. 未执行任何交易
  2. 已执行交易,但所有交易的数量之和小于包裹表中的数量

我怎样才能做到这一点?我尝试使用的每个加入都只为 2 号服务,但不考虑没有交易的包裹

我试过:

select package.packageid, package.quantity, sum(transactions.quantity) from package join transactions on package.packageid = transactions.packageid where package.quantity > sum(transactions.quantity)

也试过左加入,但它不起作用。理想情况下,我希望结果中左侧表中列出的所有包在必要时右侧为空值

4

1 回答 1

1

如果要包含没有事务的包,则需要left outer join。这将保留结果中的所有包并匹配存在事务的事务。

然后您需要分组, package.packageid以便您的sum操作仅适用于transactions属于某个特定的记录packageid

然后使用与 where 子句类似的having 子句,只是它适用于聚合函数,例如sum.

select
  p.packageid,
  p.quantity,
  sum(t.quantity) as transaction_sum
from
  packages p
  left outer join transactions t on (t.packageid = p.packageid)
group by
  p.packageid,
  p.quantity
having
  coalesce(sum(t.quantity), 0) != p.quantity
;

合并只是说,“取第一个非空值”。因此,如果sum(t.quantity)返回null,那么它将0改为使用。这将确保结果集中包含有数量但没有交易的包。

我建议您阅读 group by 和 having 。在使用 sql 时,它们是必不可少的。从本质上讲,分组依据是根据数据的共同标准将您的数据分成几组。然后根据组的质量过滤掉某些结果。

于 2012-06-04T03:33:03.137 回答