此异常记录的SQL更新查询

时间:2014-04-04 16:40:10

标签: sql

我需要一些指针来解决这个问题

例如tblStudent

ID      SNUM   Name    Grade
1       ST01
2       ST02
3       ST03
4       ST04
5              Simon
6              Kim    
7              Jessica
8              Dale
9                       12
10                      11
11                      11
12                      10

等等......模式非常明显......我需要对自己的表进行更新查询,或者对新表的插入查询看起来像

ID      SNUM   Name    Grade
1       ST01   Simon   12
2       ST02   Kim     11
3       ST03   Jessica 11
4       ST04   Dale    10

有人能指出如何解决这个问题的方向吗?

2 个答案:

答案 0 :(得分:2)

为了获得所需的结果集,请尝试

    select t1.id
         , t1.SNUM
         , t2.name
         , t3.grade
      from (
                select count(*) cnt
                  from tblStudent tagg
                 where tagg.SNUM is not null
           ) agg
cross join tblStudent   t1
      join tblStudent   t2  on ( t2.id = t1.id + agg.cnt )
      join tblStudent   t3  on ( t3.id = t2.id + agg.cnt )
     where t1.SNUM   IS NOT NULL
       and t2.name   IS NOT NULL
       and t3.grade  IS NOT NULL
         ;

说明: 基本上,sql首先计算目标记录的数量,并将原始表分成明显的3个部分。这些是连接起来的,从每一个中提取部分信息以构建完整的记录。

此方案假设所涉及的每个表中给定偏移量的数据属于同一实体

根据这个假设,连接条件可以将目标记录的数量称为偏移量。

如果需要,可以添加更多测试(例如tblStudent中的部分具有相同的大小,每个部分中只有1列不为空,没有列包含多于1个部分中的非空值)。

在oracle 12上测试过(应该适用于所有的SQL引擎)。

答案 1 :(得分:1)

如果你是2012年,你可以这样做:

;WITH cte AS (
  SELECT ID
        ,SNUM
        ,LEAD(Name,a.ct,NULL) OVER (ORDER BY ID) Name
        ,LEAD(Grade,a.ct * 2,NULL) OVER (ORDER BY ID) Grade
    FROM Student
         CROSS APPLY
         (SELECT COUNT(1) ct FROM Student WHERE Name IS NOT NULL) a
) 
SELECT * 
  FROM cte 
 WHERE Name IS NOT NULL