假设我的表的值可以是000到999(三位数小于1000)
其中一些值已填满。我们假设目前我的桌子有
000,002,005,190(001,004,003,006,... 189,191,...,999可插入表格)
并且这些值是随机分配的000和002在表中但是001还没有在表中。
如何获取我可以插入表中的值。
答案 0 :(得分:2)
DECLARE @t TABLE(id INT)
INSERT INTO @t (id)
VALUES
(1),(19),(3)
;WITH numbers AS (
SELECT ROW_NUMBER() OVER(ORDER BY o.object_id,o2.object_id) RN FROM sys.objects o
CROSS JOIN sys.objects o2
), NotExisted AS(
SELECT * FROM numbers WHERE RN NOT IN (SELECT ID FROM @t)
AND RN<1000)
SELECT TOP 1 RN FROM NotExisted ORDER BY NEWID()
答案 1 :(得分:2)
DECLARE @t TABLE
(VALUE CHAR(3))
INSERT @t
VALUES
('000'),('002'),('005'),('190')
;WITH rnCTE
AS
(
SELECT -1 + ROW_NUMBER() OVER (ORDER BY TYPE, number, name) AS rn
FROM master.dbo.spt_values
)
SELECT RIGHT('000' + CAST( rn AS VARCHAR(11)),3)
FROM rnCTE
WHERE NOT EXISTS ( SELECT 1 FROM @t
WHERE VALUE = rn
)
AND rn < 1000
修改强>
此查询的工作原理是从系统表(master.dbo.spt_values
)生成可能数字的完整列表,该表保证在CTE rnCTE
内包含超过1000行。 -1被添加到ROW_NUMBER
以使值从0开始而不是1。
外部查询零填充显示的数字,仅返回那些不在源数据中且小于1000的数字。
答案 2 :(得分:0)
您必须在第一次查询时编写T-SQL并找到差距。没有现成的SQL会直接给你带来差距。