SQL字符串中的崩溃间隔
我有一个select today,它会返回以下结果: 我做了另一个选择,返回一个值,例如5。我需要知道哪些数字不在数字1和数字5之间。在我的例子中,我需要以下结果2,4,5SQL字符串中的崩溃间隔,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
我需要帮助开发这个逻辑。用您所寻找的值构建一个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。