sql快速查询实现

时间:2022-04-26 16:25:53
数据库中存在一张表:Account。该表至少有一个字段AccountID,类型是整数型,并且是主键。
表中的部分数据如下(按照AccountID进行排序):

Table: Account
--------------------------------
|AccountID | 其他字段略
|-------------------------------
| 1 |
| 2 |
| 3 |
| 4 |
| 9 |
|10 |
|11 |
|20 |
--------------------------------
可以看出,目前表中的AccountID的数值不是连续的。
要求:
(1)请编写一个SQL语句,找出表中缺少的AccountID中,最小的一个。上表中缺少的最小的AccountID应该是5。
 (2)不要用游标,最好些一个嵌套的sql.

15 个解决方案

#1


select Top 1 from (select id =(select count(*) from Account where AccountID > =a.AccountID),AccountID from Account a) b where b.id < b.AccountID

不知道对不 没有运行过

#2


select Top 1 b.AccountID from (select id =(select count(*) from Account where AccountID  > =a.AccountID),AccountID from Account a) b where b.id  < b.AccountID 

#3


select Top 1 b.id from (select id =(select count(*) from Account where AccountID   > =a.AccountID),AccountID from Account a) b where b.id   < b.AccountID  
不好意思 没看清楚

#4



SELECT TOP 1 a.AccountID-1 AS [ID] FROM Table3 a
WHERE a.AccountID-1 > (SELECT COUNT(*) FROM Table3 WHERE AccountID<a.AccountID) 
ORDER BY AccountID

#5


上面Table3即為Account表

#6


不对啊,应该是5,怎么找出来的是8呀,紧急请求中.....

#7


to 樓主:
我在4樓回復的查詢是5啊,測試過的

#8


CREATE TABLE tb(col1 varchar(10),col2 int)
INSERT tb SELECT 'a',2
UNION ALL SELECT 'a',3
UNION ALL SELECT 'a',6
UNION ALL SELECT 'a',7
UNION ALL SELECT 'a',8
UNION ALL SELECT 'b',1
UNION ALL SELECT 'b',5
UNION ALL SELECT 'b',6
UNION ALL SELECT 'b',7
GO

--缺号分布查询
SELECT top 1 a.col1,start_col2=a.col2+1,
end_col2=(
SELECT MIN(col2) FROM tb aa
WHERE col1=a.col1 AND col2>a.col2 
AND NOT EXISTS(
SELECT * FROM tb WHERE col1=aa.col1 AND col2=aa.col2-1))
-1
FROM(
SELECT col1,col2 FROM tb
UNION ALL --为每组编号补充查询起始编号是否缺号的辅助记录
SELECT DISTINCT col1,0 FROM tb
)a,(SELECT col1,col2=MAX(col2) FROM tb GROUP BY col1)b
WHERE a.col1=b.col1 AND a.col2<b.col2 --过滤掉每组数据中,编号最大的记录
AND NOT EXISTS(
SELECT * FROM tb WHERE col1=a.col1 AND col2=a.col2+1)
ORDER BY a.col1,start_col2

结果:
/*--结果
col1       start_col2  end_col2    
-------------- -------------- ----------- 
a          1           1
*/

#9


7楼的兄弟:邪门了,我就用四楼的代码试了,返回的确实是8呀

#10


declare @a table(Account int) 
insert into @a values(1 )  
insert into @a values(2 )  
insert into @a values(3 )  
insert into @a values(4 )  
insert into @a values(9 )  
insert into @a values(10 )  
insert into @a values(11 )  
insert into @a values(20 ) 
--缺失最小的ID号 
SELECT CASE WHEN NOT EXISTS(SELECT * FROM @a WHERE Account = 1) THEN 1 ELSE MIN(Account) + 1 END  FROM @a AS A WHERE NOT EXISTS (SELECT * FROM @a AS B WHERE B.Account = A.Account + 1) 

#11


7楼的兄弟,MSN是多少,我把我的库给你,帮忙测试一下

#12


to 樓主:
不好意思,我的查詢有問題

#13


這次萬無一失了

SELECT TOP 1 AccountID+1 AS [ID]
FROM 
Account 
WHERE  AccountID<
( SELECT TOP 1 a.AccountID-1 AS [ID] FROM Account a
WHERE a.AccountID-1 > (SELECT COUNT(*) FROM Account WHERE AccountID<a.AccountID) 
ORDER BY AccountID
) ORDER BY AccountID DESC

#14


一條語句查詢,性能應該也還可以

#15


10楼的兄弟:最后一个 NOT EXISTS 是什么意思啊,晕糊糊的

#1


select Top 1 from (select id =(select count(*) from Account where AccountID > =a.AccountID),AccountID from Account a) b where b.id < b.AccountID

不知道对不 没有运行过

#2


select Top 1 b.AccountID from (select id =(select count(*) from Account where AccountID  > =a.AccountID),AccountID from Account a) b where b.id  < b.AccountID 

#3


select Top 1 b.id from (select id =(select count(*) from Account where AccountID   > =a.AccountID),AccountID from Account a) b where b.id   < b.AccountID  
不好意思 没看清楚

#4



SELECT TOP 1 a.AccountID-1 AS [ID] FROM Table3 a
WHERE a.AccountID-1 > (SELECT COUNT(*) FROM Table3 WHERE AccountID<a.AccountID) 
ORDER BY AccountID

#5


上面Table3即為Account表

#6


不对啊,应该是5,怎么找出来的是8呀,紧急请求中.....

#7


to 樓主:
我在4樓回復的查詢是5啊,測試過的

#8


CREATE TABLE tb(col1 varchar(10),col2 int)
INSERT tb SELECT 'a',2
UNION ALL SELECT 'a',3
UNION ALL SELECT 'a',6
UNION ALL SELECT 'a',7
UNION ALL SELECT 'a',8
UNION ALL SELECT 'b',1
UNION ALL SELECT 'b',5
UNION ALL SELECT 'b',6
UNION ALL SELECT 'b',7
GO

--缺号分布查询
SELECT top 1 a.col1,start_col2=a.col2+1,
end_col2=(
SELECT MIN(col2) FROM tb aa
WHERE col1=a.col1 AND col2>a.col2 
AND NOT EXISTS(
SELECT * FROM tb WHERE col1=aa.col1 AND col2=aa.col2-1))
-1
FROM(
SELECT col1,col2 FROM tb
UNION ALL --为每组编号补充查询起始编号是否缺号的辅助记录
SELECT DISTINCT col1,0 FROM tb
)a,(SELECT col1,col2=MAX(col2) FROM tb GROUP BY col1)b
WHERE a.col1=b.col1 AND a.col2<b.col2 --过滤掉每组数据中,编号最大的记录
AND NOT EXISTS(
SELECT * FROM tb WHERE col1=a.col1 AND col2=a.col2+1)
ORDER BY a.col1,start_col2

结果:
/*--结果
col1       start_col2  end_col2    
-------------- -------------- ----------- 
a          1           1
*/

#9


7楼的兄弟:邪门了,我就用四楼的代码试了,返回的确实是8呀

#10


declare @a table(Account int) 
insert into @a values(1 )  
insert into @a values(2 )  
insert into @a values(3 )  
insert into @a values(4 )  
insert into @a values(9 )  
insert into @a values(10 )  
insert into @a values(11 )  
insert into @a values(20 ) 
--缺失最小的ID号 
SELECT CASE WHEN NOT EXISTS(SELECT * FROM @a WHERE Account = 1) THEN 1 ELSE MIN(Account) + 1 END  FROM @a AS A WHERE NOT EXISTS (SELECT * FROM @a AS B WHERE B.Account = A.Account + 1) 

#11


7楼的兄弟,MSN是多少,我把我的库给你,帮忙测试一下

#12


to 樓主:
不好意思,我的查詢有問題

#13


這次萬無一失了

SELECT TOP 1 AccountID+1 AS [ID]
FROM 
Account 
WHERE  AccountID<
( SELECT TOP 1 a.AccountID-1 AS [ID] FROM Account a
WHERE a.AccountID-1 > (SELECT COUNT(*) FROM Account WHERE AccountID<a.AccountID) 
ORDER BY AccountID
) ORDER BY AccountID DESC

#14


一條語句查詢,性能應該也還可以

#15


10楼的兄弟:最后一个 NOT EXISTS 是什么意思啊,晕糊糊的