22,207
社区成员
发帖
与我相关
我的任务
分享
---- 【表t1】是全部4个号码的组合 C(15,4)=1365 组,
;WITH t1 AS
(
SELECT TOP 15 rn=ROW_NUMBER()OVER(ORDER BY @@spid)
FROM sysobjects
)
SELECT RIGHT('00'+LTRIM(a.rn),2) as No1,
RIGHT('00'+LTRIM(b.rn),2) as No2,
RIGHT('00'+LTRIM(c.rn),2) as No3,
RIGHT('00'+LTRIM(d.rn),2) as No4,
RIGHT('00'+LTRIM(a.rn),2)
+' '+RIGHT('00'+LTRIM(b.rn),2)
+' '+RIGHT('00'+LTRIM(c.rn),2)
+' '+RIGHT('00'+LTRIM(d.rn),2) as NoTextA
FROM t1 a
JOIN t1 b ON a.rn<b.rn
JOIN t1 c ON b.rn<c.rn
JOIN t1 d ON c.rn<d.rn
--- 【表t2】是全部6个号码的组合 C(15,6) =5005组。
;WITH t2 AS
(
SELECT TOP 15 rn=ROW_NUMBER()OVER(ORDER BY @@spid)
FROM sysobjects
)
SELECT RIGHT('00'+LTRIM(a.rn),2) as No1,
RIGHT('00'+LTRIM(b.rn),2) as No2,
RIGHT('00'+LTRIM(c.rn),2) as No3,
RIGHT('00'+LTRIM(d.rn),2) as No4,
RIGHT('00'+LTRIM(e.rn),2) as No5,
RIGHT('00'+LTRIM(f.rn),2) as No6,
RIGHT('00'+LTRIM(a.rn),2)
+' '+RIGHT('00'+LTRIM(b.rn),2)
+' '+RIGHT('00'+LTRIM(c.rn),2)
+' '+RIGHT('00'+LTRIM(d.rn),2)
+' '+RIGHT('00'+LTRIM(e.rn),2)
+' '+RIGHT('00'+LTRIM(f.rn),2) as NoTextB
FROM t2 a
JOIN t2 b ON a.rn<b.rn
JOIN t2 c ON b.rn<c.rn
JOIN t2 d ON c.rn<d.rn
JOIN t2 e ON d.rn<e.rn
JOIN t2 f ON e.rn<f.rn
declare @max int
set @max=15
;with t as (
select number as rn
from master..spt_values
where type='p' and number between 1 and @max
)
select ROW_NUMBER() over(order by @@rowcount) as rid,a.rn as n1,b.rn as n2,c.rn as n3,d.rn as n4
into #t1
FROM t a
JOIN t b ON a.rn<b.rn
JOIN t c ON b.rn<c.rn
JOIN t d ON c.rn<d.rn
select *
into #t2
from #t1
cross apply (
select number as n5
from master..spt_values
where type='p' and number>n4 and number<=@max
) n5
cross apply (
select number as n6
from master..spt_values
where type='p' and number>n5 and number<=@max
) n6
select * from #t2
drop table #t2
drop table #t1
;with t as (
select number as rn
from master..spt_values
where type='p' and number between 1 and 48
)
select ROW_NUMBER() over(order by @@rowcount) as rid,a.rn as n1,b.rn as n2,c.rn as n3,d.rn as n4
into #t1
FROM t a
JOIN t b ON a.rn<b.rn
JOIN t c ON b.rn<c.rn
JOIN t d ON c.rn<d.rn
select *
into #t2
from #t1
cross apply (
select number as n5
from master..spt_values
where type='p' and number>n4 and number<=48
) n5
cross apply (
select number as n6
from master..spt_values
where type='p' and number>n5 and number<=48
) n6
drop table #t2
drop table #t1
;with t as (
select number as rn
from master..spt_values
where type='p' and number between 1 and 4
)
select ROW_NUMBER() over(order by @@rowcount) as rid,a.rn as n1,b.rn as n2,c.rn as n3,d.rn as n4
into #t1
FROM t a
JOIN t b ON a.rn<b.rn
JOIN t c ON b.rn<c.rn
JOIN t d ON c.rn<d.rn
;with t as (
select number as rn
from master..spt_values
where type='p' and number between 1 and 15
)
select ROW_NUMBER() over(order by @@rowcount) as rid,a.rn as n1,b.rn as n2,c.rn as n3,d.rn as n4,e.rn as n5,f.rn as n6
into #t2
FROM t a
JOIN t b ON a.rn<b.rn
JOIN t c ON b.rn<c.rn
JOIN t d ON c.rn<d.rn
JOIN t e ON d.rn<e.rn
JOIN t f ON e.rn<f.rn
select a.rid,b.n1,b.n2,b.n3,b.n4,b.n5,b.n6,a.n1,a.n2,a.n3,a.n4
from (
--select MIN(a.rid) as rid,b.n1,b.n2,b.n3,b.n4
select a.rid,b.n1,b.n2,b.n3,b.n4
from #t2 a
cross apply(
select *
from #t1
where n1 in (a.n1,a.n2,a.n3,a.n4,a.n5,a.n6)
and n2 in (a.n1,a.n2,a.n3,a.n4,a.n5,a.n6)
and n3 in (a.n1,a.n2,a.n3,a.n4,a.n5,a.n6)
and n4 in (a.n1,a.n2,a.n3,a.n4,a.n5,a.n6)
) b
--group by b.n1,b.n2,b.n3,b.n4
) a
left join #t2 b on a.rid=b.rid
order by 1,a.n1,a.n2,a.n3,a.n4
drop table #t1
drop table #t2
-- #t1 为原始t1表,这里取1-48的数字组合,4个数
;with t as (
select number as rn
from master..spt_values
where type='p' and number between 1 and 48
)
select ROW_NUMBER() over(order by @@rowcount) as rid
,a.rn as n1,b.rn as n2,c.rn as n3,d.rn as n4
into #t1
FROM t a
JOIN t b ON a.rn<b.rn
JOIN t c ON b.rn<c.rn
JOIN t d ON c.rn<d.rn
-- #t2 为原始t2表,这里取4-51的数字组合,6个数
;with t as (
select number as rn
from master..spt_values
where type='p' and number between 4 and 51
)
select ROW_NUMBER() over(order by @@rowcount) as rid
,a.rn as n1,b.rn as n2,c.rn as n3,d.rn as n4,e.rn as n5,f.rn as n6
into #t2
FROM t a
JOIN t b ON a.rn<b.rn
JOIN t c ON b.rn<c.rn
JOIN t d ON c.rn<d.rn
JOIN t e ON d.rn<e.rn
JOIN t f ON e.rn<f.rn
-- #t3 为从t1原始表中提取所有存在的值,即1-48,根据实际情况可能是任意值
select distinct val
into #t3
from #t1
unpivot(val for col in (n1,n2,n3,n4)) p
-- #t4 为原始表t2行转列的结果集,用以分组统计出现次数
select *
into #t4
from #t2
unpivot(val for col in (n1,n2,n3,n4,n5,n6)) p
-- 将#t4中列的值只去#t3中出现的内容,且同一行,出现的值至少达到4次
-- 同1个id,达到4次以上的值统计,即表示该id对应的行,在#t1中有子集
-- 将结果保存至#t5
select rid,COUNT(0) as cnt
into #t5
from #t4
where val in (
select val from #t3
)
group by rid having(COUNT(0)>=4)
-- 根据#t5得到实际原始表t2中有t1子集的项
select top 1000 b.* from #t5 a
left join #t2 b on a.rid=b.rid
order by b.rid
drop table #t1
drop table #t2
drop table #t3
drop table #t4
drop table #t5
USE [TEST]
GO
---- 【表t1】是设定1--48,提供组合 C(48,4)用
;WITH t1 AS
(
SELECT TOP 48 rn=ROW_NUMBER()OVER(ORDER BY @@spid)
FROM sysobjects
),
---- 【表t2】是设定1--48,提供组合 C(48,6)用
t2 AS
(
SELECT TOP 48 rn=ROW_NUMBER()OVER(ORDER BY @@spid)
FROM sysobjects
),
---- 【表t3】是全部4个号码的组合 C(48,4)=194580 组,
t3 AS
(SELECT RIGHT('00'+LTRIM(a.rn),2) as No1,
RIGHT('00'+LTRIM(b.rn),2) as No2,
RIGHT('00'+LTRIM(c.rn),2) as No3,
RIGHT('00'+LTRIM(d.rn),2) as No4,
RIGHT('00'+LTRIM(a.rn),2)
+' '+RIGHT('00'+LTRIM(b.rn),2)
+' '+RIGHT('00'+LTRIM(c.rn),2)
+' '+RIGHT('00'+LTRIM(d.rn),2) as NoTextA
FROM t1 a
JOIN t1 b ON a.rn<b.rn
JOIN t1 c ON b.rn<c.rn
JOIN t1 d ON c.rn<d.rn
),
--- 【表t4】是全部6个号码的组合 C(48,6) =12271512组。
t4 AS
(SELECT
RIGHT('00'+LTRIM(a.rn),2) as No1,
RIGHT('00'+LTRIM(b.rn),2) as No2,
RIGHT('00'+LTRIM(c.rn),2) as No3,
RIGHT('00'+LTRIM(d.rn),2) as No4,
RIGHT('00'+LTRIM(e.rn),2) as No5,
RIGHT('00'+LTRIM(f.rn),2) as No6,
RIGHT('00'+LTRIM(a.rn),2)
+' '+RIGHT('00'+LTRIM(b.rn),2)
+' '+RIGHT('00'+LTRIM(c.rn),2)
+' '+RIGHT('00'+LTRIM(d.rn),2)
+' '+RIGHT('00'+LTRIM(e.rn),2)
+' '+RIGHT('00'+LTRIM(f.rn),2) as NoTextB
FROM t2 a
JOIN t2 b ON a.rn<b.rn
JOIN t2 c ON b.rn<c.rn
JOIN t2 d ON c.rn<d.rn
JOIN t2 e ON d.rn<e.rn
JOIN t2 f ON e.rn<f.rn),
---- 每一行 NoTextB遍历4个号码的组合NoTextA,如果全部包含在NoTextB里就把这些NoTextB作为运算结果(结果需为不重复记录)
t5 AS
(
select NoTextB
from t4 A
join t3 B on A.NoTextB like '%'+B.NoTextA+'%'
)
SELECT distinct NoTextB FROM t5 order by NoTextB
[/quote]
除非t1表各字段的数据不是依次递增的,也就是不知道哪个字段是当前数据记录里的最大数,比如2、3、6、5这样记录的,否则#12是个不错的方案。
USE [TEST]
GO
---- 【表t1】是设定1--48,提供组合 C(48,4)用
;WITH t1 AS
(
SELECT TOP 48 rn=ROW_NUMBER()OVER(ORDER BY @@spid)
FROM sysobjects
),
---- 【表t2】是设定1--48,提供组合 C(48,6)用
t2 AS
(
SELECT TOP 48 rn=ROW_NUMBER()OVER(ORDER BY @@spid)
FROM sysobjects
),
---- 【表t3】是全部4个号码的组合 C(48,4)=194580 组,
t3 AS
(SELECT RIGHT('00'+LTRIM(a.rn),2) as No1,
RIGHT('00'+LTRIM(b.rn),2) as No2,
RIGHT('00'+LTRIM(c.rn),2) as No3,
RIGHT('00'+LTRIM(d.rn),2) as No4,
RIGHT('00'+LTRIM(a.rn),2)
+' '+RIGHT('00'+LTRIM(b.rn),2)
+' '+RIGHT('00'+LTRIM(c.rn),2)
+' '+RIGHT('00'+LTRIM(d.rn),2) as NoTextA
FROM t1 a
JOIN t1 b ON a.rn<b.rn
JOIN t1 c ON b.rn<c.rn
JOIN t1 d ON c.rn<d.rn
),
--- 【表t4】是全部6个号码的组合 C(48,6) =12271512组。
t4 AS
(SELECT
RIGHT('00'+LTRIM(a.rn),2) as No1,
RIGHT('00'+LTRIM(b.rn),2) as No2,
RIGHT('00'+LTRIM(c.rn),2) as No3,
RIGHT('00'+LTRIM(d.rn),2) as No4,
RIGHT('00'+LTRIM(e.rn),2) as No5,
RIGHT('00'+LTRIM(f.rn),2) as No6,
RIGHT('00'+LTRIM(a.rn),2)
+' '+RIGHT('00'+LTRIM(b.rn),2)
+' '+RIGHT('00'+LTRIM(c.rn),2)
+' '+RIGHT('00'+LTRIM(d.rn),2)
+' '+RIGHT('00'+LTRIM(e.rn),2)
+' '+RIGHT('00'+LTRIM(f.rn),2) as NoTextB
FROM t2 a
JOIN t2 b ON a.rn<b.rn
JOIN t2 c ON b.rn<c.rn
JOIN t2 d ON c.rn<d.rn
JOIN t2 e ON d.rn<e.rn
JOIN t2 f ON e.rn<f.rn),
---- 每一行 NoTextB遍历4个号码的组合NoTextA,如果全部包含在NoTextB里就把这些NoTextB作为运算结果(结果需为不重复记录)
t5 AS
(
select NoTextB
from t4 A
join t3 B on A.NoTextB like '%'+B.NoTextA+'%'
)
SELECT distinct NoTextB FROM t5 order by NoTextB