二 SQLSERVER的实现部分1 有订单表,需要实现它的编号,格式如下:200211030001……200222039999等 2 有表T1,T2,现有一事务,在向表T1添加数据时,同时也必须向T2也添加数据,如何实现该事务 3 如何向T1中的编号字段(code varchar(20))添加一万条记录,不充许重复,规则如下:编号的数据必须从小写的a-z之间取值 4 如何删除表中的重复数据,请使用游标与分组的办法 5 如何求表中相邻的两条记录的某字段的值之差 6 如何统计数据库中所有用户表的数据,显示格式如下:表名 记录数 sales 23 7 如何删除数据库中的所有用户表(表与表之间有外键关系) 8 表A editor_id lb2_id
123 000
123 003
123 003
456 007
456 006
表B lb2_id lb2_name
000 a
003 b
006 c
007 d
显示 a 共1条 (表A内lb2_id为000的条数)
b 共2条(表A内lb2_id为003的条数) 9 人员情况表(employee):里面有一字段文化程度(wh):包括四种情况(本科以上,大专,高中,初中以下),现在我要根据年龄字段查询统计出:表中文化程度为本科以上,大专,高中,初中以下,各有多少人,占总人数多少。SELECT wh AS 学历,age as 年龄, Count(*) AS 人数, Count(*) * 100 /(SELECT Count(*) FROM employee) AS 百分比FROM employee GROUP BY wh,age学历 年龄 人数 百分比本科以上 20 34 14大专 20 33 13高中 20 33 13初中以下 20 100 40本科以上 21 50 20 10 现在有三个表student:(FID 学生号,FName 姓名),subject:(FSubID 课程号,FSubName 课程名), Score(FScoreId 成绩记录号,FSubID 课程号,FStdID 学生号,FScore 成绩)怎么能实现这个表:姓名 英语 数学 语文 历史张萨 78 67 89 76王强 89 67 84 96 SELECT a.FName AS 姓名, 英语 = SUM(CASE b.FSubName WHEN '英语' THEN c.FScore END), 数学 = SUM(CASE b.FSubName WHEN '数学' THEN c.FScore END), 语文 = SUM(CASE b.FSubName WHEN '语文' THEN c.FScore END), 历史 = SUM(CASE b.FSubName WHEN '历史' THEN c.FScore END)FROM Student a, Subject b, Score cWHERE a.FID = c.FStdId AND b.FSubID = c.FsubID GROUP BY a.FName 11 原始表的数据如下:PID PTime PNo111111 2003-01-28 04:30:09 111111 2003-01-28 18:30:00222222 2003-01-28 04:31:09 333333 2003-01-28 04:32:09 111111 2003-02-09 03:35:25 222222 2003-02-09 03:36:25 333333 2003-02-09 03:37:25 查询生成表PDate 111111 222222 333333 ......2003-01-28 04:30:09 04:31:09 04:32:09 ......2003-01-28 18:30:00 2003-02-09 03:35:25 03:36:25 03:37:25 ...... 12 表一(AAA)商品名称mc 商品总量sl A 100 B 120表二(BBB)商品名称mc 出库数量sl A 10 A 20 B 10 B 20 B 30 用一条SQL语句算出商品A,B目前还剩多少?一 declare @AAA table (商品名称 varchar(10), 商品总量 int)insert into @AAA values('A',100)insert into @AAA values('B',120) declare @BBB table (商品名称 varchar(10), 出库数量 int)insert into @BBB values('A', 10)insert into @BBB values('A', 20)insert into @BBB values('B', 10)insert into @BBB values('B', 20)insert into @BBB values('B', 30) select TA.商品名称,A-B AS 剩余数量 FROM(select 商品名称,sum(商品总量) AS Afrom @AAA group by 商品名称)TA,(select 商品名称,sum(出库数量) AS Bfrom @BBB group by 商品名称)TBwhere TA.商品名称=TB.商品名称二 select 商品名称,sum(商品总量) 剩余数量 from (select * from @aaa union all select 商品名称,-出库数量 from @bbb) a group by 商品名称 13 优化这句SQL语句UPDATE tblExlTempYear SET tblExlTempYear.GDQC = tblExlTempMonth.GDQC FROM tblExlTempYear,tblExlTempMonth where tblExlTempMonth.GDXM=tblExlTempYear.GDXM and tblExlTempMonth.TXDZ=tblExlTempYear.TXDZ (1)、加索引:tblExlTempYear(GDXM,TXDZ)tblExlTempMonth (GDXM,TXDZ)(2)、删除无用数据(3)、转移过时数据(4)、加服务器内存,升级服务器(5)、升级网络系统 UPDATE tblExlTempYear SET tblExlTempYear.GDQC = tblExlTempMonth.GDQC FROM tblExlTempYear (index indexY),tblExlTempMonth (index indexM)where tblExlTempMonth.GDXM=tblExlTempYear.GDXM and tblExlTempMonth.TXDZ=tblExlTempYear.TXDZ 14 品种 日期 数量P0001 2002-1-10 10P0001 2002-1-10 11P0001 2002-1-10 50P0001 2002-1-12 9P0001 2002-1-12 8P0001 2002-1-12 7P0002 2002-10-10 5P0002 2002-10-10 7P0002 2002-10-12 0.5P0003 2002-10-10 5P0003 2002-10-12 7P0003 2002-10-12 9 结果要先按照品种汇总,再按照日期汇总,结果如下:P0001 2002-1-10 71P0001 2002-1-12 24P0002 2002-10-10 12P0002 2002-10-12 0.5P0003 2002-10-10 5P0003 2002-10-12 16 SQL SERVER能做出这样的汇总吗… 15 在分組查循中with{cube|rollup}的區別是什么?如: use pangu select firm_id,p_id,sum(o_price_quantity)as sum_values from orders group by firm_id,p_id with cube 與 use pangu select firm_id,p_id,sum(o_price_quantity)as sum_values from orders group by firm_id,p_id with rollup 的區別是什么? CUBE 和 ROLLUP 之间的区别在于: CUBE 生成的结果集显示了所选列中值的所有组合的聚合。ROLLUP 生成的结果集显示了所选列中值的某一层次结构的聚合。 例如,简单表 Inventory 中包含:Item Color Quantity -------------------- -------------------- -------------------------- Table Blue 124 Table Red 223 Chair Blue 101 Chair Red 210 下列查询将生成小计报表:SELECT CASE WHEN (GROUPING(Item) = 1) THEN 'ALL' ELSE ISNULL(Item, 'UNKNOWN') END AS Item, CASE WHEN (GROUPING(Color) = 1) THEN 'ALL' ELSE ISNULL(Color, 'UNKNOWN') END AS Color, SUM(Quantity) AS QtySumFROM InventoryGROUP BY Item, Color WITH ROLLUP Item Color QtySum -------------------- -------------------- -------------------------- Chair Blue 101.00 Chair Red 210.00 Chair ALL 311.00 Table Blue 124.00 Table Red 223.00 Table ALL 347.00 ALL ALL 658.00 (7 row(s) affected)如果查询中的 ROLLUP 关键字更改为 CUBE,那么 CUBE 结果集与上述结果相同,只是在结果集的末尾还会返回下列两行:ALL Blue 225.00 ALL Red 433.00 CUBE 操作为 Item 和 Color 中值的可能组合生成行。例如,CUBE 不仅报告与 Item 值 Chair 相组合的 Color 值的所有可能组合(Red、Blue 和 Red + Blue),而且报告与 Color 值 Red 相组合的 Item 值的所有可能组合(Chair、Table 和 Chair + Table)。对于 GROUP BY 子句中右边的列中的每个值,ROLLUP 操作并不报告左边一列(或左边各列)中值的所有可能组合。例如,ROLLUP 并不对每个 Color 值报告 Item 值的所有可能组合。ROLLUP 操作的结果集具有类似于 COMPUTE BY 所返回结果集的功能;然而,ROLLUP 具有下列优点: ROLLUP 返回单个结果集;COMPUTE BY 返回多个结果集,而多个结果集会增加应用程序代码的复杂性。ROLLUP 可以在服务器游标中使用;COMPUTE BY 不可以。有时,查询优化器为 ROLLUP 生成的执行计划比为 COMPUTE BY 生成的更为高效。 16 假如我有两个表
表1(电话号码,是否存在)
表2(电话号码,是否拨打)
想查找表1中的电话号码是否在表2中存在,如果存在就更新表1中的是否存在字段为1。 UPDATE 表1 SET 是否存在=1
WHERE EXISTS(SELECT * FROM 表2 WHERE 表2.电话号码 = 表1.电话号码) 17 用存储过程调用外部程序.
不过要做成com控件
用sp_OACreate存储过程)
DECLARE @object int
DECLARE @hr int
DECLARE @src varchar(255), @desc varchar(255)
EXEC @hr = sp_OACreate 'SQLDMO.SQLServer', @object OUT
IF @hr <> 0
BEGIN
EXEC sp_OAGetErrorInfo @object, @src OUT, @desc OUT
SELECT hr=convert(varbinary(4),@hr), Source=@src, Description=@desc
RETURN
END