Sql 查找最小值和最大值之间的间隙
两张桌子 由VoucherCode(可空int)和Scheme(bigint)组成的成员 Scheme—由schemeId(bigint)、mincode(int)、maxcode(int)组成 我需要在最小和最大代码中查找成员的VoucherCode中的任何间隙。如果mincode为1,maxcode为10,而现有的vouchercodes为2、3和4,则应返回1。如果存在代码1、2和4,则应返回3。如果存在1、2和3,则应返回4 这就是我到目前为止所做的:Sql 查找最小值和最大值之间的间隙,sql,sql-server,max,min,Sql,Sql Server,Max,Min,两张桌子 由VoucherCode(可空int)和Scheme(bigint)组成的成员 Scheme—由schemeId(bigint)、mincode(int)、maxcode(int)组成 我需要在最小和最大代码中查找成员的VoucherCode中的任何间隙。如果mincode为1,maxcode为10,而现有的vouchercodes为2、3和4,则应返回1。如果存在代码1、2和4,则应返回3。如果存在1、2和3,则应返回4 这就是我到目前为止所做的: SELECT MIN(ID +
SELECT MIN(ID + 1) FROM (
SELECT mincode AS ID from Scheme as s UNION ALL
SELECT
MIN(vouchercode + 1)
FROM
member mmm where mmm.voucherCode is not null
) AS T1
WHERE
ID+1 NOT IN (SELECT vouchercode as ID FROM member m where voucherCode is not null)
它可以工作,但不适用于所有3种场景。如果存在2、3和4,则返回null而不是1。1、3和4存在,然后它返回2,对吗!1、2和3存在,它返回null,而不是4 这里有一种使用理货台的方法。我的系统中有一个CTE视图,但我在这里提取了它们。如果需要,可以将理货表扩展到更多行
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 MIN(t.N)
from cteTally t
left join Scheme s on s.ID = t.N
where s.ID is null
这将是一个非常简单的理货表。