我正在使用Firebird 2.5或3.0。我有一个查询,它从两个相同的子查询中合并相同的字段。我想向第二个子查询的列添加固定值,以确保该子查询的值与第一个子查询的相同列值不同:
select Q1.* from (select VDATE, VTIME, STAT, PRICURR, SECCURR from "DevHistory"
where DEVID = :ID and VDATE = :DAY1 order by VDATE, VTIME) Q1
union all
select Q2.* from (select VDATE, VTIME + 1440, STAT, PRICURR, SECCURR from "DevHistory"
where DEVID = :ID and VDATE = :DAY2 order by VDATE, VTIME) Q2;
VDATE是整数朱利安日期,VTIME是自午夜以来的整数分钟数,并且:DAY1
和:DAY2
参数始终是2个连续的天数,因此第二个子查询的1440常数。
VTIME + 1440
语法当然不起作用,但这是我想要完成的。有没有办法在查询中做到这一点?还是检索后必须对数据进行按摩?
答案 0 :(得分:0)
对于我输入的查询,答案是在两个子查询中都需要为VTIME字段加别名,然后查询才能工作。输入后,我在VTIME + 1440
处收到-104错误,但是如果我将第一个子项更改为VTIME as MyTime
,将第二个子项更改为(VTIME + 1440) as MyTime
,则可以正常工作。
select Q1.* from (select VDATE, VTIME AS MyTime, STAT, PRICURR, SECCURR
from "DevHistory"
where DEVID = :ID and VDATE = :DAY1 order by VDATE, MyTime) Q1
union all
select Q2.* from (select VDATE, (VTIME + 1440) AS MyTime, STAT, PRICURR, SECCURR
from "DevHistory"
where DEVID = :ID and VDATE = :DAY2 order by VDATE, MyTime) Q2;
包装器之所以在这里,是因为如果我不这样做,它会抱怨order by
子句。
这两个:ID
参数与FireDAC一起使用,都使用在Params [0]中设置的单个传递的设备ID进行填充。我还没有在其他数据库库中尝试过它(我有UniDAC,有机会的话会在那儿尝试。)