Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对于SQL Server中的此类数据,应该使用什么循环?_Sql_Sql Server_Loops - Fatal编程技术网

对于SQL Server中的此类数据,应该使用什么循环?

对于SQL Server中的此类数据,应该使用什么循环?,sql,sql-server,loops,Sql,Sql Server,Loops,我有一个数据列表,其中包含3列Status、Next Status和Default(0,1)。如何循环遍历数据并获得默认值为1的最后一个状态 这是我的桌子 ID Status Next Status Default -------------------------------- 1 PASS FAIL 0 2 PASS HOLD 0 3 PASS

我有一个数据列表,其中包含3列Status、Next Status和Default(0,1)。如何循环遍历数据并获得默认值为1的最后一个状态

这是我的桌子

ID        Status    Next Status    Default
--------------------------------
 1          PASS       FAIL           0
 2          PASS       HOLD           0
 3          PASS       RELE           1
 4          FAIL       EXEM           0
 5          FAIL       HOLD           1
 6          HOLD       RELE           0
 7          RELE       HOLD           0
 8          RELE       CANC           0
Status    Next Status    Default
--------------------------------
PASS       FAIL           0
PASS       HOLD           0
PASS       RELE           1
FAIL       EXEM           0
FAIL       HOLD           1
HOLD       RELE           0
RELE       HOLD           0
RELE       CANC           0
例如,我的
状态
通过
,现在它将在表中循环并检查默认值为1的最后一个状态

Samle1:通过-发布-1

由于RELE处于下一个状态,它将查看RELE

RELE CANC 0当下一个默认状态变为0时,它将获得RELE

我有一个数据列表,包含3列状态、下一个状态和 默认值(0,1)。如何循环遍历数据并获取最后的状态 其中Default=1

这是我的桌子

ID        Status    Next Status    Default
--------------------------------
 1          PASS       FAIL           0
 2          PASS       HOLD           0
 3          PASS       RELE           1
 4          FAIL       EXEM           0
 5          FAIL       HOLD           1
 6          HOLD       RELE           0
 7          RELE       HOLD           0
 8          RELE       CANC           0
Status    Next Status    Default
--------------------------------
PASS       FAIL           0
PASS       HOLD           0
PASS       RELE           1
FAIL       EXEM           0
FAIL       HOLD           1
HOLD       RELE           0
RELE       HOLD           0
RELE       CANC           0
示例我的状态是PASS,现在它将在表中循环并检查 默认值为1的最后一个状态是什么

Samle1:通过-发布-1

由于RELE处于下一个状态,它将查看RELE

RELE CANC 0当下一个默认状态变为0时,它将获得 瑞尔

我不确定我是否正确理解了要求

我的理解是:对于任何给定的状态,您都需要计算其先前的状态(如果有),默认值为1。我知道“status”列值是行中“next status”列的给定值的前一个状态。如果我的这种理解是错误的,请纠正我

根据您对本程序的输入,以下是两个查询:

  • 状态是否将作为查询的输入?如果是:
    SELECT  DISTINCT
            S.Status
            ,LastStatus = OA.Status 
    FROM    Status S
            OUTER APPLY (
                            SELECT  TOP 1 SI.Status
                            FROM    Status SI
                            WHERE   SI.[Next Status] = S.Status
                            AND     SI.Default = 1
                        ) OA
    WHERE   S.Status = '<input status name>';
    

  • 是否要获取最新的“下一个状态”值,其中“默认值”=1,“状态”=PASS?此外,表中是否有唯一的行标识符?如果没有,则应该有一个相关数据,并且该数据本身没有顺序。如果要按顺序排序,则需要另一列,即带有时间戳的列。有了它,解决方案就很简单了。是的,重复@R.J.Dunnill所说的——虽然上面的列表是从上到下排序的,但在关系数据库中没有这样的默认排序,即使看起来它们是按照进入的顺序出现的。有时可能是这样,但根据很多情况,例如索引,情况会发生变化。如果您需要一个持久的行id,那么您需要在表中定义它。一旦你这样做了,你就永远不会用一个
    循环来做这件事,这是程序性思维。它很可能是一个递归的CTE来回答这个问题。另外,假设它们的编号为1到8,我可以看到您的第一个示例是如何从PASS移动到RELE的,但我不知道您的解释的后半部分是什么意思。