日期:2014-05-17  浏览次数:20380 次

一道sql的题目,求解决。万分感谢

------解决方案--------------------
引用:
3.20
a和b可以,c不可以,因为有计算得到的值(平均值)

补充一下,视图的更新是转换为基本表的更新,a和b显然可以,c有求平均值,无法转换为基本表的更新
------解决方案--------------------
引用:
引用:
我不是说没看懂英文, 而是觉得他问的有问题。
这个。我这个题目是数据库系统概论第五版的课后习题。。
能不能请教一下1楼的那个题怎么做?



CREATE TABLE [dbo].[marks](
[student_id] [int] IDENTITY(1,1) NOT NULL,
[score] [int] NULL
) ON [PRIMARY]

GO
Insert Into [dbo].[marks] Values (3)
Insert Into [dbo].[marks] Values (3)
Insert Into [dbo].[marks] Values (1)
Insert Into [dbo].[marks] Values (4)
Insert Into [dbo].[marks] Values (6)

1--.WITHOUT WITH  

 select * ,
     DENSE_RANK() OVER 
    ( ORDER BY i.[score] DESC) AS Rank
from [dbo].[marks] I


2 -WITH WITH  
;WITH  CTE1 ([score], ROWID)
AS
-- Define the CTE query.
(
select   [score] ,
ROW_NUMBER() OVER (ORDER BY [score] ASC) AS ROWID
from ( select distinct [score] from [dbo].[marks] ) A
)
 select [student_id], [marks].[score],DENSE_RANK=ROWID  from [marks] left join  CTE1 
 On [marks].[score]=CTE1.[score]
 Order By ROWID
------解决方案--------------------
引用:
引用:我不是说没看懂英文, 而是觉得他问的有问题。
这个。我这个题目是数据库系统概论第五版的课后习题。。
能不能请教一下1楼的那个题怎么做?


1楼的题很简单,
sql2000可以用临时表的identity列, 或者count计数法。
count计数法,可以参考我的blog里“sql查询题解”及后面的评论(如果mark值有重复的话).

sql05 ,08就更简单了,内置了序号函数
row_number, rank,dense_rank等等.
你的问题,一个dense_rank就解决了。
三者之间具体的区别,你可以查下手册。
------解决方案--------------------
引用:
引用:引用:
我不是说没看懂英文, 而是觉得他问的有问题。
这个。我这个题目是数据库系统概论第五版的课后习题。。
能不能请教一下1楼的那个题怎么做?


CREATE TABLE [dbo].[marks](
[student_id] [int] IDENTITY(1,1) NOT NULL……

没有with那个没考虑分数重复的问题。
带with那个把ASC改成DESC就可以了。