我有一个表具有主键user_id的用户当我们插入user_details时会自动递增。现在我需要列出所有丢失(或删除)的user_id 。 我已经这样试过了。
DECLARE @NUMBER BIGINT = (SELECT MIN(USER_ID) FROM USERS)
DECLARE @MAX BIGINT = (SELECT MAX(USER_ID) FROM USERS)
CREATE TABLE TEMP_USERS (USER_ID BIGINT)
WHILE @NUMBER <= @MAX
BEGIN
INSERT INTO TEMP_USERS
VALUES(@NUMBER);
SET @NUMBER = @NUMBER+1;
END
SELECT USER_ID from TEMP_USERS
EXCEPT
SELECT USER_ID from USERS
但它花了太长时间。 是否有其他方法可以提高性能?
谢谢, 维杰
答案 0 :(得分:2)
如果您使用的是MSSQL 2005+。然后你可以这样做:
DECLARE @NUMBER BIGINT =(SELECT MIN(USER_ID) from USERS)
DECLARE @MAX BIGINT =(SELECT MAX(USER_ID) from USERS)
;WITH Nbrs ( n ) AS (
SELECT @NUMBER UNION ALL
SELECT 1 + n FROM Nbrs WHERE n < @MAX)
SELECT
Nbrs.n AS USERID
FROM
Nbrs
WHERE NOT EXISTS
(
SELECT NULL FROM USERS
WHERE USERS.USER_ID=Nbrs.n
)
OPTION ( MAXRECURSION 0 )
<强>更新强>
解决评论。在这种情况下MAXRECURSION
做了什么。当我们使用递归CTE函数时,有可能以一种永不结束的方式编写它。服务器MAXRECURSION
为100.可以通过使用不应该使用服务器MAXRECURSION
的提示来覆盖它。
当我们使用0时,它没有任何MAXRECURSION
。如果我们不设置MAXRECURSION
然后在100行之后它将崩溃并抛出MAXRECURSION
已满足的异常。
因为我们可以预期OP在序列中有更多缺少的用户ID,我们需要指出我们要继续进行递归,直到n < @MAX