SQL字符串中的崩溃间隔

SQL字符串中的崩溃间隔,sql,sql-server,Sql,Sql Server,我有一个select today,它会返回以下结果: 我做了另一个选择,返回一个值,例如5。我需要知道哪些数字不在数字1和数字5之间。在我的例子中,我需要以下结果2,4,5 我需要帮助开发这个逻辑。用您所寻找的值构建一个cte。然后获取表中不存在的值 with cte (rn) as (select 1 as rn union all select rn + 1 from

我有一个select today,它会返回以下结果:

我做了另一个选择,返回一个值,例如5。我需要知道哪些数字不在数字1和数字5之间。在我的例子中,我需要以下结果2,4,5


我需要帮助开发这个逻辑。

用您所寻找的值构建一个cte。然后获取表中不存在的值

with cte (rn) as (select    1 as rn
                  union all
                  select    rn + 1
                  from      cte
                  where     rn + 1 <= 5)
select  cte.rn
from    cte
where   not exists (select  1 from  actualtable where   nr_volume = cte.rn)

您的问题不清楚,但似乎您想要的数字不在两个查询返回的范围内,但在该范围内。为此,您可以使用理货表和一些方法来限制结果。注意,您在预期结果中包含了5个,但这与您的问题相矛盾,因为您在预期结果中没有包含1个

declare @table1 table (i int)
insert into @table1
values (1),(3)

declare @table2 table (i int)
insert into @table2
values (5)

declare @max int = (select top 1 i from (select max(i) i from @table1  union select max(i) from @table2) x order by i desc)
declare @min int = (select top 1 i from (select min(i) i from @table1  union select min(i) from @table2) x order by i asc)

;WITH
    E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)),
    E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
    E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max
    cteTally(N) AS 
    (
        SELECT  ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
    )
select N from cteTally
where 
    N not in (select * from @table1) 
    and N not in (select * from @table2)
    and N > @min
    and N < @max
GO

我使用NOT EXISTS创建了一个示例,我相信它可以帮助您:

--DROP TABLE #Temp
--GO
CREATE TABLE #Temp
(
    NR_VOLUME   INT
)
INSERT INTO #Temp
VALUES (1),(3)

--Create Temp table for number List
--DROP TABLE #NumberList
--GO
CREATE TABLE #NumberList
(
    Seq INT
)

DECLARE @NumberCheckFrom    INT=1
DECLARE @NumberCheckTo  INT=100

WHILE @NumberCheckTo>=@NumberCheckFrom
BEGIN
    INSERT INTO #NumberList
    SELECT @NumberCheckFrom
    SET @NumberCheckFrom +=1
END

DECLARE @NumberFrom INT=0
DECLARE @NumberTo   INT=5

SELECT * 
FROM  #NumberList NL
WHERE Seq>=@NumberFrom 
AND Seq<=@NumberTo
AND NOT EXISTS (SELECT 1 
                FROM #Temp T
                WHERE NL.Seq = T.NR_VOLUME
                )

看起来您正试图依靠标识来提供序列号。没有。只有像在选择过程中的行数这样的东西才能实现这一点。样本数据和预期输出将有助于澄清这一点。否则,您可以使用计数表和减号运算符:服务器重新启动或其他故障后的连续值-SQL server可能会出于性能原因缓存标识值,并且在数据库故障或服务器重新启动期间,某些分配的值可能会丢失。这可能导致插入时标识值出现间隙。如果间隙不可接受,则应用程序应使用自己的机制生成键值。请在循环时检查此链接。。。这不会在规模上表现良好,只是一句忠告。@NumberCheckTo的值来自哪里?我只是想知道你是如何动态处理的,我同意你的看法。我只是把数字放在不存在的地方。通常我会创建一个表并将序列放入表中,然后只执行一次while。