【问题标题】:join and group by query works in firebird 2.1 but not in 1.5join 和 group by 查询在 firebird 2.1 中有效,但在 1.5 中无效
【发布时间】:2014-02-20 04:27:12
【问题描述】:

我有以下查询在 firebird 2.1 中可以正常工作,但是我无法让它在 1.5 中具有完全相同结构的数据库上工作

select c.printchecknumber, v.voidamount 
from checks c 
join (select checknumber, sum(voidamount) as voidamount 
      from checkitem 
      where voidtype =1 
      group by checknumber) v on c.checknumber = v.checknumber 
order by c.printchecknumber

有什么想法吗?

错误信息是 令牌无效 动态 SQL 错误 SQL 错误代码 = -104 令牌未知 - 第 1 行,字符 61 错误出现在第二次选择的开始

【问题讨论】:

标签: sql firebird


【解决方案1】:

我猜 Firebird 1.5 不支持 from 子句中的子查询。在任何情况下,您都可以将其编写为更简单的查询。以下应该做你想做的事:

select c.printchecknumber, sum(voidamount) as voidamount 
from checkitem ci join
     checks c
     on ci.checknumber = c.checknumber
where ci.voidtype =1 
group by c.printchecknumber;

编辑:

如果你想包含checkid,那么这可能会起作用:

select c.printchecknumber, c.checkid, sum(voidamount) as voidamount 
from checkitem ci join
     checks c
     on ci.checknumber = c.checknumber
where ci.voidtype =1 
group by c.printchecknumber, c.checkid;

【讨论】:

  • 这似乎工作得很好,谢谢你的帮助。表检查中有一个名为 checkid 的附加列,此列不在 checkitem 表中,如果我修改为 select c.checkid, c.printchecknumber, sum(void...... 它说“选择中的表达式无效列表”
【解决方案2】:

我不知道为什么它在早期系统上不起作用,我需要知道错误消息来提供帮助,但以下内容适用于任何支持我相信 firebird 的 over() 子句的 sql 3.0

select c.printchecknumber,
       sum(v.voidamount) over (partition by printchecknumber)
from checks c
join checkitem v on c.checknumber = v.checknumber and v.voidtype = 1

【讨论】:

  • Windows 功能将仅在即将发布的 Firebird 3.0 版本中可用(现在已经“即将发布”3 年了......)
  • firebird 3 的第二个 alpha 版本将于本周发布。
猜你喜欢
  • 2020-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-04
  • 2021-02-20
  • 1970-01-01
  • 1970-01-01
  • 2021-03-27
相关资源
最近更新 更多