日期:2014-05-18  浏览次数:20563 次

数据库系统原理上机考试----关于游标
不要求复杂,调理清晰就行,太复杂考试时也不会!
考试时用的是sql2000

货车(货车编号,车牌,出场日期,司机,最大运输量)
司机(司机编号,姓名,联系方式,驾驶证日期)
货物(货物编号,货物名称,产地,单价,货物总量)
运输记录(运输单编号,货车编号,货物编号,运输量,交易类型,运输日期)

1.修改货物表,调整总量超过350000的货物单价为原来的90%

2.找出运输过所有货物的司机

------解决方案--------------------
SQL code

--1.修改货物表,调整总量超过350000的货物单价为原来的90%
 update 货物 set 单价=0.9*单价 where 货物总量>350000

2.找出运输过所有货物的司机
 select b.司机编号, b.姓名 
 from 货车 a inner join 司机 b on a.司机=b.司机编号
 where a.货车编号 in
 (select 货车编号 from 运输记录 group by 货车编号
 having count(distinct 货物编号)=(select count(货物编号) from 货物编号))

------解决方案--------------------
SQL code
游標

1.修改货物表,调整总量超过350000的货物单价为原来的90%

DECLARE cur CURSOR LOCAL FOR
SELECT 货物编号,货物总量 FROM 货物表
DECLARE @货物编号 NVARCHAR(50),@货物总量 INT
OPEN cur
FETCH NEXT FROM cur INTO @货物编号,@货物总量
WHILE @@FETCH_STATUS=0
BEGIN
    IF @货物总量>350000
        UPDATE 货物表 SET 单价=单价*0.9  WHERE 货物编号=@货物编号
    FETCH NEXT FROM cur INTO @货物编号,@货物总量
END
CLOSE cur
DEALLOCATE cur

------解决方案--------------------
SQL code
2.找出运输过所有货物的司机

DECLARE @T TABLE(司机编号 NVARCHAR(50),姓名 NVARCHAR(50))

DECLARE cur2 CURSOR LOCAL FOR
SELECT 司机编号,姓名 FROM 司机
DECLARE @司机编号 NVARCHAR(50),@姓名 NVARCHAR(50)
OPEN cur2
FETCH NEXT FROM cur2 INTO @司机编号,@姓名
WHILE @@FETCH_STATUS=0
BEGIN
    IF NOT EXISTS(SELECT 1 FROM 货物  AS x WHERE NOT EXISTS(SELECT 1 FROM 货车表 AS a INNER JOIN 运输记录表 AS b ON a.货车编号=b.货车编号 AND a.出场日期=b.出场日期 WHERE b.货物编号=x.货物编号))
        INSERT INTO @T
                ( 司机编号, 姓名 )
        VALUES  ( @司机编号, -- 司机编号 - nvarchar(50)
                  @姓名  -- 姓名 - nvarchar(50)
                  )
    FETCH NEXT FROM cur2 INTO @司机编号,@姓名
END
CLOSE cur2
DEALLOCATE cur2
SELECT * FROM @T