2014-09-24 54 views
1

我想在表中找到缺失的數字......表像這樣。如何在使用sqlserver的表中找到缺失的數字?

Sno    Branch 

    1     ABC 
    2     ABC 
    3     ABC 
    5     ABC // 4th sno is missing 
    6     ABC 
    8     ABC // 7th sno is missing 
    10     ABC // 9th sno is missing 

我發現失蹤SNO使用此查詢

ALTER proc [dbo].[K_RT_DCNoMissing]--1,50 
as 
begin 

declare @id int 
    set @id = 0 
declare @maxid int 

--set @id = @fromvalue 
select @maxid = (select count(*) dcno from K_RT_Dailyentryretail nolock) 


create table #IDSeq 
(
id int 
) 

while 0<@maxid--whatever you max is 
begin 
insert into #IDSeq values(@id) 

set @id = @id + 1 
set @maxid = @maxid - 1 
-- print @maxid 
end 

select 
s.id 
from 
#idseq s 
left join K_RT_Dailyentryretail t on 
    s.id = t.dcno 

    where t.dcno is null order by s.id asc 

    drop table #IDSeq 

    end 

我得到了把這樣的..

MissingNo's 
    4 
    7 
    9 

現在我要顯示斯諾與分行名稱一樣。

MissingNo's   Branch 
     4     ABC 
     7     ABC 
     9     ABC 

我怎樣才能分行名稱...

Am getting output as 
4 abc 
4 cde 
4 fgh 
7 abc 
7 cde 
7 fgh 

but what actually am expecting is 
4 abc 
7 cde 
.  .. 
.  .. 

+0

你將如何讓分公司的名稱,如果沒有關係 – niyou 2014-09-24 10:10:50

+0

怎麼是你應該得到的,不存在連續的分支?順便說一句,你的帖子存儲過程不能工作,因爲內部選擇由評論行破壞。 – Paolo 2014-09-24 10:11:06

+0

如果之間缺少數字,那麼alwasy GAP僅用於1位數?這會發生嗎?像1,2,3,6?在3個GAP在那裏但是下一個數字不是5個之後,它大於那個。這會發生嗎? – AK47 2014-09-24 10:14:31

回答

2

您可以使用CTE構建所有分支的表格以及每個分支的全部數字範圍。然後將其加入主表以找出缺失的部分。這將允許您連續丟失數字,例如3,4和5失蹤。您可以調整@minid@maxid以達到您想要的範圍。如果@maxid可以大於32767,那麼您將需要對批量範圍進行一些操作。

declare @minid int, @maxid int 

set @minid = 1 
set @maxid = (select count(*) dcno from K_RT_Dailyentryretail with (nolock)) 

; with Branches as (
    select distinct Branch from K_RT_Dailyentryretail 
) 
, CTE as 
(
    select @minid as Sno, Branch from Branches 
    union all 
    select Sno + 1, Branch from CTE where Sno < @maxid 
) 

select CTE.Sno, CTE.Branch from CTE 
    left outer join K_RT_Dailyentryretail k on k.Branch = CTE.Branch and CTE.Sno = k.Sno 
where k.Sno is null 
option (MAXRECURSION 32767); 

SQLFiddle這裏:http://sqlfiddle.com/#!3/13653/13

+0

; ( 從K_RT_Dailyentryretail中選擇不同的分支...在這裏我得到一個錯誤信息,如..語句終止。在語句完成前,最大遞歸100已經耗盡 – ramarao 2014-09-24 12:17:39

+0

正在獲取輸出爲1 abc,1 cde,1 cde這意味着一個sno重複分支的名字 – santhosha 2014-09-25 06:04:40

+0

@santhosha根本看不到任何在小提琴中返回的1s ... – Rhumborl 2014-09-25 08:24:54

0

我正在考慮你之間的差距數量將始終只有1位數。 在這種情況下會爲你工作,

;With CTE as 
(
select Sno,Branch,ROW_NUMBER() over (order by Sno) R 
from C 
) 
select a.Sno+ 1,a.Branch from CTE as a 
left join CTE as b on a.R + 1= b.R 
where a.Sno + 1 <> b.Sno 

一件事是,丟失你想分行行,我還以爲失蹤行,你想有上一行的分支。

0

假設每個分支都有它自己的一套SNO數字,這個工程:

select sno-1 as sno, branch 
from t1 
where sno-1 NOT in (select sno from t1 as t2 where t1.branch = t2.branch) 
and sno > 1 
; 

,你可以點擊這裏:http://sqlfiddle.com/#!3/daa81d/3

如果SNO是一個獨特的密鑰,讓我知道,我會修改答案。

編輯:像AK47的答案,我假設差距只有一行。

相關問題