当前位置: 代码迷 >> Sql Server >> 怎么修改代码,找出#tb1表里每一组号码 与 #tb2表里有5个或6个号码相同的所有的号码
  详细解决方案

怎么修改代码,找出#tb1表里每一组号码 与 #tb2表里有5个或6个号码相同的所有的号码

热度:20   发布时间:2016-04-24 09:47:56.0
如何修改代码,找出#tb1表里每一组号码 与 #tb2表里有5个或6个号码相同的所有的号码
--> 建立数据表#tb1 (实际数据有7000多)

if object_id('tempdb.dbo.#tb1') is not null drop table #tb1
go 

create table #tb1(ID [int] IDENTITY(1,1) NOT NULL,notext varchar(20),no1 int,no2 int,no3 int,no4 int,no5 int,no6 int,blu int)
insert #tb1
select '10 11 15 26 31 32','10','11','15','26','31','32','06' union all
select '10 11 12 22 31 32','10','11','12','22','31','32','07' union all
select '03 11 26 31 32 33','03','11','26','31','32','33','08' union all
select '10 11 15 23 25 31','10','11','15','23','25','31','03' union all
select '11 16 23 26 31 32','11','16','23','26','31','32','07' union all
select '08 10 13 15 26 31','08','10','13','15','26','31','15'  --- select * from #tb1

--> 建立数据表#tb2 (实际数据有100多万)

if object_id('tempdb.dbo.#tb2') is not null drop table #tb2
go 
create table #tb2(ID [int] IDENTITY(1,1) NOT NULL,notext varchar(20),no1 int,no2 int,no3 int,no4 int,no5 int,no6 int,blu int,site varchar(12))
insert #tb2
select '10 11 15 26 31 32','10','11','15','26','31','32','06','taobao' union all
select '10 11 15 26 28 32','10','11','15','26','28','32','11','taobao' union all
select '10 11 15 21 26 31','10','11','15','21','26','31','09','taobao' union all
select '06 10 15 26 31 32','06','10','15','26','31','32','01','taobao' union all
select '02 10 11 15 31 32','02','10','11','15','31','32','07','taobao' union all
select '10 11 17 26 31 32','10','11','17','26','31','32','12','taobao' union all
select '10 11 24 26 31 32','10','11','24','26','31','32','12','taobao' union all
select '10 11 25 26 31 32','10','11','25','26','31','32','12','taobao' union all
select '10 11 15 21 26 31','10','11','15','21','26','31','09','taobao' union all
select '10 11 15 25 26 32','10','11','15','25','26','32','12','lecai' union all
select '02 10 11 26 31 32','02','10','11','26','31','32','09','cpbao' union all
select '10 11 19 26 31 32','10','11','19','26','31','32','09','cpbao' union all
select '10 11 26 31 32 33','10','11','26','31','32','33','09','cpbao' union all
select '10 11 15 23 26 31','10','11','15','23','26','31','03','cpbao' union all
select '03 04 05 26 31 32','03','04','05','26','31','32','07','cpbao' union all
select '01 02 09 19 26 31','01','02','09','19','26','31','15','cp163'    --- select * from #tb2


--找出#tb1表里 与 #tb2表里有5个或6个号码相同的每注号码

--问题:用以下语句仅仅找出#tb1表里第一组号码 与 #tb2表里有5个或6个号码相同的每一注号码,

--请问如何修改代码,找出#tb1表里每一组号码 与 #tb2表里有5个或6个号码相同的所有的号码?

select top 1 id,notext,No1,No2,No3,No4,No5,No6 into #tb3 from #tb1  --取 #tb1表里第一组号码,如果全部取就是得到错误的结果  



;WITH CTE AS ( select QTY from #tb1 unpivot (QTY for TYPE in(No1,No2,No3,No4,No5,No6)) as p ) --这里无法依次取到#tb1表里每一组号码
Select ID as RRID,notext, 
 ((Case when NO1 in (Select * from CTE ) then 1 else 0 end)+  
(Case when NO2 in (Select * from CTE ) then 1 else 0 end)+  
(Case when NO3 in (Select * from CTE ) then 1 else 0 end)+  
(Case when NO4 in (Select * from CTE ) then 1 else 0 end)+ 
(Case when No5 in (Select * from CTE ) then 1 else 0 end)+ 
(Case when NO6 in (Select * from CTE ) then 1 else 0 end)) as RRpNumber Into #RRepTable 
From #tb2

-- 找6个相同号码 
Select notext,blu From  #tb2 Where                       
ID in (Select ID From #RRepTable left join  #tb2 on  #RRepTable.RRID= #tb2.ID Where 1=1    
and (RRpNumber  between 6 and 6)) 
union all
 ----- 找5个相同号码
Select notext,blu From  #tb2 Where                       
ID in (Select ID From #RRepTable left join  #tb2 on  #RRepTable.RRID= #tb2.ID Where 1=1    
and (RRpNumber  between 5 and 5))  

drop table #tb1  drop table #tb2 drop table #tb3 drop table  #RRepTable  


--请问如何修改代码,找出#tb1表里每一组号码 与 #tb2表里有5个或6个相同号码的所有的结果?

------解决思路----------------------
将6组数字转换成bit值,很简单的比较。
原创,求推荐。
DECLARE @base bigint
SET @base = 2

SELECT POWER(@base,number) value
  INTO #1bit
  FROM master..spt_values
 WHERE type = 'p'
   AND number < 36 -- 最大可选数

SELECT p1.value 
------解决思路----------------------
 p2.value value
  INTO #2bitDiff
  FROM #1bit p1
  JOIN #1bit p2
    ON p1.value <> p2.value

SELECT ID,
       POWER(@base,no1-1) +
       POWER(@base,no2-1) +
       POWER(@base,no3-1) +
       POWER(@base,no4-1) +
       POWER(@base,no5-1) +
       POWER(@base,no6-1) AS value
  INTO #tb1x
  FROM #tb1

SELECT ID,
       POWER(@base,no1-1) +
       POWER(@base,no2-1) +
       POWER(@base,no3-1) +
       POWER(@base,no4-1) +
       POWER(@base,no5-1) +
       POWER(@base,no6-1) AS value
  INTO #tb2x
  FROM #tb2

-- 找6个相同号码 
SELECT #tb1x.ID ID1,
       #tb2x.ID ID2
  INTO #6same
  FROM #tb2x
  JOIN #tb1x
    ON #tb2x.value = #tb1x.value

SELECT #tb2.*
  FROM #6same
  JOIN #tb2
    ON #tb2.ID = #6same.ID2

-- 找5个相同号码,异或有2个bit为1
SELECT #tb1x.ID ID1,
       #tb2x.ID ID2
  INTO #5same
  FROM #tb2x
  JOIN #tb1x
    ON (#tb2x.value ^ #tb1x.value) IN (SELECT value FROM #2bitDiff)

SELECT #tb1.notext,
       #tb2.*
  FROM #5same
  JOIN #tb1
    ON #tb1.ID = #5same.ID1
  JOIN #tb2
    ON #tb2.ID = #5same.ID2

         ID notext                       no1         no2         no3         no4         no5         no6         blu site
----------- -------------------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ------------
          1 10 11 15 26 31 32             10          11          15          26          31          32           6 taobao

notext                        ID notext                       no1         no2         no3         no4         no5         no6         blu site
-------------------- ----------- -------------------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ------------
10 11 15 26 31 32              2 10 11 15 26 28 32             10          11          15          26          28          32          11 taobao
10 11 15 26 31 32              3 10 11 15 21 26 31             10          11          15          21          26          31           9 taobao
10 11 15 26 31 32              4 06 10 15 26 31 32              6          10          15          26          31          32           1 taobao
10 11 15 26 31 32              5 02 10 11 15 31 32              2          10          11          15          31          32           7 taobao
10 11 15 26 31 32              6 10 11 17 26 31 32             10          11          17          26          31          32          12 taobao
10 11 15 26 31 32              7 10 11 24 26 31 32             10          11          24          26          31          32          12 taobao
10 11 15 26 31 32              8 10 11 25 26 31 32             10          11          25          26          31          32          12 taobao
10 11 15 26 31 32              9 10 11 15 21 26 31             10          11          15          21          26          31           9 taobao
10 11 15 26 31 32             10 10 11 15 25 26 32             10          11          15          25          26          32          12 lecai
10 11 15 26 31 32             11 02 10 11 26 31 32              2          10          11          26          31          32           9 cpbao
10 11 15 26 31 32             12 10 11 19 26 31 32             10          11          19          26          31          32           9 cpbao
10 11 15 26 31 32             13 10 11 26 31 32 33             10          11          26          31          32          33           9 cpbao
03 11 26 31 32 33             13 10 11 26 31 32 33             10          11          26          31          32          33           9 cpbao
10 11 15 23 25 31             14 10 11 15 23 26 31             10          11          15          23          26          31           3 cpbao
10 11 15 26 31 32             14 10 11 15 23 26 31             10          11          15          23          26          31           3 cpbao
  相关解决方案