此异常记录的SQL更新查询
我需要一些解决这个问题的建议 例如此异常记录的SQL更新查询,sql,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
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
有人能给我指出一个解决这个问题的方向吗 要获得所需的结果集,请尝试
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
中的部分大小相同,每个部分中正好有一列不为空,没有一列包含超过一个部分的非空值)
已在oracle 12上测试(但应能在所有sql引擎上运行)。为了获得所需的结果集,请尝试
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
中的部分大小相同,每个部分中正好有一列不为空,没有一列包含超过一个部分的非空值)
已在oracle 12上测试(但应能在所有sql引擎上运行)。为了获得所需的结果集,请尝试
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
中的部分大小相同,每个部分中正好有一列不为空,没有一列包含超过一个部分的非空值)
已在oracle 12上测试(但应能在所有sql引擎上运行)。为了获得所需的结果集,请尝试
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
中的部分大小相同,每个部分中正好有一列不为空,没有一列包含超过一个部分的非空值)
在oracle 12上测试(但应能在所有sql引擎上运行)。如果您是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
如果你是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
如果你是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
如果你是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
您使用的是什么关系型数据库MySQL、sql server或其他版本?sql server哪个版本?sql server 2008 Express您使用的是什么关系型数据库MySQL、sql server或其他版本?sql server哪个版本?sql server 2008 Express您使用的是什么关系型数据库MySQL,sql server或其他版本?sql server哪个版本?sql server 2008 Express您使用的是什么RDBMS MySQL、sql server或其他版本?sql server哪个版本?sql server 2008 Express嗯,谢谢您的回答,您能解释一下吗?因为在sqlfiddle中,我在“on子句”中得到了一个错误未知列“agg.cnt”:选择t1.ID,t1.SNUM,t2.NAME,t3.GRADE from table_NAME t1 join table_NAME t2 on(t2.ID=t1.ID+agg.cnt)join table_NAME t3 on(t3.ID=t2.ID+agg.cnt)交叉连接(从table_NAME tagg中选择count(*)cnt,其中tagg.SNUM不为空)agg其中t1.SNUM不为NULL,t2.NAME不为NULL,t3.GRADE不为NULL我更正了导致语法错误的语句中基表的顺序。对于给您带来的不便,我深表歉意。无需道歉,我应该感谢您的帮助:)在SQLFIDLE中,您的select语句似乎没有得到任何结果。请看一看,空字符串不是
null
值!调整insert语句后。查询产生了预期的结果()@user1618180:您的fiddle设置为在MySQL中运行。嗯,谢谢您的回答,您能解释一下吗,因为在sqlfiddle中,我在“on子句”中得到了一个错误未知的列“agg.cnt”:从表_NAME t1 join table_NAME t2 on中选择t1.ID、t1.SNUM、t2.NAME、t3.GRADE(t2.ID=t1.ID+agg.cnt)(t3.ID=t2.ID+agg.cnt)交叉联接上的联接表_name t3(从表_name tagg中选择count(*)cnt,其中tagg.SNUM不为null)agg,其中t1.SNUM不为null,t2.name不为null,t3.GRADE不为null我更正了导致语法错误的语句中基表的顺序。对于给您带来的不便,我深表歉意。无需道歉,我应该感谢您的帮助:)在SQLFIDLE中,您的select语句似乎没有得到任何结果。请看一看,空字符串不是null
值!调整insert语句后。查询生成预期结果()@user1618180:fiddle设置为在MySQL.U中运行