在Firebird数据库上使用SQL标记满足特定条件的记录

时间:2018-10-11 09:38:19

标签: sql firebird

我目前正在使用Firebird数据库,并且正在尝试标识/标记记录
具有零pos_buildcount值并且零记录的前一条记录的pos_buildcount值不是255。我可以在excel中做到这一点,但我想在SQL查询中做到这一点,因为excel只能处理一定数量的记录。本质上,我希望我的结果看起来像下图:

Required Results

我尝试了以下链接来尝试选择单个记录,但是大多数解决方案使用我的数据库没有的id号(我不知道为什么),或者解决方案使用了Firebird没有的row_number()命令。

Selecting the last record that meets a condition

Is there a way to access the “previous row” value in a SELECT statement?

1 个答案:

答案 0 :(得分:0)

  

使用我的数据库没有的ID号

然后添加它。

SQL是集合语言:https://en.wikipedia.org/wiki/Set_(mathematics)

根据定义,集合中的元素彼此之间,北部或南部或前后都不位于左侧或右侧。他们只是存在。以无序的方式。

因此,如果要对行进行排序-那么必须在其中添加一些排序值(字段,列),然后填充该值。然后从表中读取(如果需要),您可能会要求按该值对结果进行排序。

到目前为止,Firebird拥有按其可能想要的任何顺序读取行的所有权利,甚至可以更改磁盘上行的顺序(它不会,但是这是ndetail的实现,将来可能会更改)。

您必须添加一些ID列,然后进行填充。 这将使“最后记录”或“先前记录”或“行上方”成为有意义的习惯用法:“ ID小于当前对象ID的对象”。到目前为止,在SQL术语中,“最新记录”中没有任何含义,并且不可能可靠地制定查询条件。

在那之后,更改表中的标志列将变成一条简单的MERGE语句。

MERGE INTO MyTable T1
USING MyTable T2 
   ON (T2.ID = T1.ID - 1) AND (T2.pos_buildcount <> 255)
WHEN MATCHED THEN
  UPDATE SET T1.flag = 1

http://www.firebirdsql.org/file/documentation/reference_manuals/fblangref25-en/html/fblangref25-dml-merge.html

或者,不将列添加到表中,而是在查询中创建“虚拟”列,从而将表自身连接起来。

https://en.wikipedia.org/wiki/Join_(SQL)#Left_outer_join

SELECT T1.*, T2.Vehicle as Flag
FROM MyTable T1 
LEFT JOIN MyTable T2
       ON (T2.ID = T1.ID - 1) AND (T2.pos_buildcount <> 255)

保证只有在ID列中填充不带任何整数的整数时,它才有效。否则,除“ T2.ID = T1.ID - 1”之外,“先前记录”的含义还有其他定义,但该想法成立。定义“先验”是指实列上的实数据,然后可以将表与其自身进行比较。