两张桌子 由VoucherCode(可空int)和Scheme(bigint)组成的成员 Scheme-由schemeId(bigint),mincode(int),maxcode(int)
组成我需要在最小和最大代码中找到成员的代金券中的任何空白。如果mincode为1且maxcode为10,并且现有的凭证代码为2,3和4则应该返回1.如果存在代码1,2和4,则应该返回3.如果存在1,2和3,则应该带回来。
这是我到目前为止所做的:
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.
答案 0 :(得分:0)
以下是使用计数表执行此操作的一种方法。我在我的系统中有ctes的视图,但我在这里提取它们。如果需要,您可以将计数表扩展到更多行。
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