首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

求几个超高难度存储过程请绝对高手帮忙!该如何解决

2012-02-09 
求几个超高难度存储过程请绝对高手帮忙!问题如下:给出表D--------------idabcde1134602234003123004260005

求几个超高难度存储过程请绝对高手帮忙!
问题如下:
给出表
D
--------------
id     a   b   c   d   e
1       1   3   4   6   0
2       2   3   4   0   0
3       1   2   3   0   0
4       2   6   0   0   0  
5       2   3   4   5   0
6       2   3   5   0   0
7       1   2   3   4   6
8       1   3   4   5   6
9       1   0   0   0   0
--------------
第一存储过程:两个参数   一个表名,一个个数
例如:exec   存储过程名   'D ',3
得到
L1
------------
item1       个数
1                   5
2                   6
3                   7
4                   5
5                   3
6                   4
-----------
执行过程:扫描A
        统计出不同元素的个数,也就是
1   2   3   4   5   6   (不包括0),分别出现的
个数,并且要求出现的个数> =3,得到

第二个存储过程:一个参数
exec   存储过程名   'L1 '
执行过程为L1自连接,得到
C2
-------------
item1     item2    
    1             2            
    1             3            
    1             4            
    1             5          
    1             6            
    2             3            
    2             4            
    2             5          
    2             6            
    3             4            
    3             5            
    3             6            
    4             5            
    4             6            
    5             6            
--------------
第三个存储过程:三个参数(两个表名,一个个数)
exec   存储过程名   'D ', 'C2 ',3
执行过程为:
再扫描数据库D统计C2中各行元素出现的
次数
C2
--------------------
item1     item2     个数
    1             2             2
    1             3             4


    1             4             3
    1             5             1
    1             6             3
    2             3             5
    2             4             3
    2             5             2
    2             6             2
    3             4             5
    3             5             3
    3             6             3
    4             5             2
    4             6             3
    5             6             1
--------------------
说明:以C2中的1     2为例
因为1     2同时(不管顺序如何)出现在数据库D
中的3   7   行,所以个数为2,再以1   3为例,同时
出现在数据库D中的1   3   7   8行,所以个数为4,依
次类推....
      由
      C2选出个数> =3的,得到
L2
--------------------
item1     item2     个数
    1             3             4
    1             4             3
    1             6             3
    2             3             5
    2             4             3
    3             4             5
    3             5             3
    3             6             3
    4             6             3
--------------------
第四个存储过程:两个参数(两个表名)
exec   存储过程名   'D ', 'L2 '
      由L2(各行元素)扫描数据库(为了简化数据库D),把
不包含L2中的项从数据库中删除,因为L2中每
一行元素的个数为2(不包含“个数”这一列)
所以把D中的第九行删除,又因为数据库D中第
四行只有2   6这两个元素,而L2中没有这个2   6
所以把D中的第四行也删除,此时D简化为D '
D '
--------------
id     a   b   c   d   e
1       1   3   4   6   0
2       2   3   4   0   0
3       1   2   3   0   0

5       2   3   4   5   0
6       2   3   5   0   0
7       1   2   3   4   6
8       1   3   4   5   6

--------------
第五个存储过程:一个参数


exec   存储过程名   'L2 '
        统计L2(扫描L2)中各不同元素出现的次数
L2
--------------------
item1     item2     个数
    1             3             4
    1             4             3
    1             6             3
    2             3             5
    2             4             3
    3             4             5
    3             5             3
    3             6             3
    4             6             3
--------------------
各元素出现的次数(不包含个数这一列)
1       3
2       2
3       5
4       4
5       1
6       3
因为L2中每一行包含两个元素(不算“个数”这一列),而
5这个元素在L2中只出现了一次,所以,就把L2中所有包含5
的行删除,简化后的得到L2 '
L2 '
--------------------
item1     item2     个数
    1             3             4
    1             4             3
    1             6             3
    2             3             5
    2             4             3
    3             4             5
 
    3             6             3
    4             6             3
--------------------
第六个存储过程:一个参数(表名)
exec   存储过程名   'L2 '
L2 '
--------------------
item1     item2     个数
    1             3             4
    1             4             3
    1             6             3
    2             3             5
    2             4             3
    3             4             5
 
    3             6             3
    4             6             3
--------------------
        由L2 '自连接(不包括个数这一列),得到C3
C3
------------------
item1   item2   item3


    1           3           4
    1           3           6
    1           4           6
    2           3           4
    3           4           6
------------------
请高手给出这几个存储过程,非常的谢谢!
可以参考
http://community.csdn.net/Expert/topic/5303/5303577.xml?temp=.4888117

[解决办法]
--第一個
Create Table D
(idInt,
aInt,
bInt,
cInt,
dInt,
eInt)
Insert D Select 1, 1, 3, 4, 6, 0
Union All Select 2, 2, 3, 4, 0, 0
Union All Select 3, 1, 2, 3, 0, 0
Union All Select 4, 2, 6, 0, 0, 0
Union All Select 5, 2, 3, 4, 5, 0
Union All Select 6, 2, 3, 5, 0, 0
Union All Select 7, 1, 2, 3, 4, 6
Union All Select 8, 1, 3, 4, 5, 6
Union All Select 9, 1, 0, 0, 0, 0
GO
Create Procedure SP_TEST1(@TableName Varchar(100), @Count Int)
As
Begin
Declare @S Nvarchar(4000)
Select @S = ' '
Select @S = @S + ' Union All Select ' + Name + ' As item1 From ' + @TableName + ' Where ' + Name + ' != 0 ' From SysColumns Where ID = OBJECT_ID(@TableName) And ColID > 1
Select @S = N 'Select item1, Count(*) As 个数 From ( ' + Stuff(@S, 1, 11, ' ') + ' ) A Group By item1 Having Count(item1) > = ' + Rtrim(@Count)
EXEC(@S)
End
GO
exec SP_TEST1 'D ',3
GO
Drop Procedure SP_TEST1
Drop Table D
--Result
/*
item1个数
15
26
37
45
53
64
*/
[解决办法]
--第二個
--建立存儲過程
GO
Create Procedure SP_TEST2(@TableName Varchar(100))
As
Begin
Declare @S Nvarchar(4000)
Select @S = 'Select A.item1, B.item1 As item2 From ' + @TableName + ' A Inner Join ' + @TableName + ' B On A.item1 < B.item1 Order By A.item1, item2 '
EXEC(@S)
End
GO
--測試
Create Table L1(item1 Int, 个数 Int)
Insert L1 EXEC SP_TEST1 'D ',3

EXEC SP_TEST2 'L1 '
GO
--結果
/*
item1item2
12
13
14
15
16
23
24
25
26
34
35
36
45
46
56
*/
[解决办法]
--第三個
--建立存儲過程
GO
Create Procedure SP_TEST3(@TableName1 Varchar(100), @TableName2 Varchar(100), @Count Int)
As
Begin
Declare @S Nvarchar(4000)
Select @S = ' '
Select @S = @S + ' Union All Select id, ' + Rtrim(ColID) + ' As ColID, ' + Name + ' As item From ' + @TableName1
From SysColumns Where ID = OBJECT_ID(@TableName1) And ColID > 1
Select @S = 'Select * Into TempTable From ( ' + Stuff(@S, 1, 11, ' ') + ' ) A '
EXEC(@S)

Select @S = ' Select A.item As item1, C.item As item2, Count(Distinct A.ID) As 個數 From TempTable A Inner Join ' + @TableName2 + ' B On A.item = B.item1 Inner Join TempTable C On A.ID = C.ID And A.ColID < C.ColID Inner Join ' + @TableName2 + ' D On C.item = D.item2 Group By A.item, C.item Having Count(Distinct A.ID) > = ' + Rtrim(@Count) + ' Order By A.item, C.item '
EXEC(@S)



Drop Table TempTable
End
GO
--測試
Create Table C2(item1 Int, item2 Int)
Insert C2 EXEC SP_TEST2 'L1 '

EXEC SP_TEST3 'D ', 'C2 ', 3

Drop Procedure SP_TEST3
--結果
/*
item1item2個數
134
143
163
235
243
345
353
363
463
*/

热点排行