求几个超高难度存储过程请绝对高手帮忙!
问题如下:
给出表
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
*/