Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.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:根据列后面显示的行设置列值_Sql_Db2 - Fatal编程技术网

SQL:根据列后面显示的行设置列值

SQL:根据列后面显示的行设置列值,sql,db2,Sql,Db2,我正在创建一种动态web表单,用户可以在其中拖放字段来创建自己的表单。元素通过标题进行分组,标题作为H类型存储在表中。在下表中,有两个组,1-4和5-6 如果字段的RLS_标志是用户可以设置的Y,则要求该字段以最终形式出现。但是,类型H元素的RLS_标志的值是根据同一组中的任何字段是否已设置为Y而自动确定的 将只有一个p类型的元素,给定该元素的序列号,我需要找到同一组中的所有行,检查其中是否有任何行的RLS_标志设置为Y,并设置组头的RLS_标志 我提出了下面的查询,但我确信这是最糟糕的查询,我

我正在创建一种动态web表单,用户可以在其中拖放字段来创建自己的表单。元素通过标题进行分组,标题作为H类型存储在表中。在下表中,有两个组,1-4和5-6

如果字段的RLS_标志是用户可以设置的Y,则要求该字段以最终形式出现。但是,类型H元素的RLS_标志的值是根据同一组中的任何字段是否已设置为Y而自动确定的

将只有一个p类型的元素,给定该元素的序列号,我需要找到同一组中的所有行,检查其中是否有任何行的RLS_标志设置为Y,并设置组头的RLS_标志

我提出了下面的查询,但我确信这是最糟糕的查询,我需要一些优化查询的建议

UPDATE TABLE_NAME SET RLS_FLAG = 'Y' WHERE EXISTS (
    SELECT 1 FROM TABLE_NAME WHERE RLS_FLAG = 'Y' 
    AND SEQUENCE > ( SELECT COALESCE ( MAX( SEQUENCE ), 0 ) FROM TABLE_NAME WHERE TYPE = 'H' AND SEQUENCE < ( SELECT SEQUENCE FROM TABLE_NAME WHERE TYPE = 'P'))
    AND SEQUENCE < ( SELECT COALESCE ( MIN( SEQUENCE ), 999 ) FROM TABLE_NAME WHERE TYPE = 'H' AND SEQUENCE > ( SELECT SEQUENCE FROM TABLE_NAME WHERE TYPE = 'P'))
)

在上面的语句中,我试图找到p上方的H元素序列和p下方的H元素序列。然后找到两个值之间的所有行,并检查其中是否有任何行的RLS_标志设置为Y

,下面是表示逻辑的另一种方式:

update t
    set rls_flag = 'Y'
    where type = 'H' and
          exists (select 1
                  from (select t2.*,
                               lead(case when type = 'H' then sequence end) over (order by sequence) as next_h_sequence
                        from t t2
                       ) t2
                  where t2.rls_flag = 'Y' and
                        t2.sequence >= t.sequence and t2.sequence < next_h_sequence
                 );
update t
    set rls_flag = 'Y'
    where type = 'H' and
          exists (select 1
                  from (select t2.*,
                               lead(case when type = 'H' then sequence end) over (order by sequence) as next_h_sequence
                        from t t2
                       ) t2
                  where t2.rls_flag = 'Y' and
                        t2.sequence >= t.sequence and t2.sequence < next_h_sequence
                 );