我需要一些指针来解决这个问题
例如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
有人能指出如何解决这个问题的方向吗?
答案 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