我已经阅读了几篇文章,认为普通程序员所犯的错误之一就是没有使用SQL的潜力,从那以后我开始用SQLish解决方案替换部分代码而不是使用编程语言获取数据和处理,尽管我是一个真正的SQL新手。
假设我有一个随机填充0到10之间值的表格,我想知道此范围内缺少哪些值。
例如,该表包含以下值:0, 1, 3, 4, 5, 7, 8, 9
。
查询应返回:2, 6, 10
。
答案 0 :(得分:0)
[F5]解决方案(假设是sql server):
-- table with id=0..10
drop table #temp
GO
create table #temp (
id int not null identity(0,1),
x int
)
GO
insert into #temp (x) values(0)
GO 11
-- your number:
drop table #numbers
GO
select
*
into #numbers
from (
select 0 as n union all select 1 union all select 3 union all select 4 union all select 5 union all select 7 union all select 8 union all select 9
) x
GO
-- result:
select
*
from #temp t
left join #numbers n
on t.id=n.n
where 1=1
and n.n is null
答案 1 :(得分:0)
此解决方案使用SQL-Server-Syntax(但仅AFAIK GO
特定于SQL Server Management Studio)
我会加入一个表值函数,可以获取某个范围内的所有数字(example fiddle):
CREATE FUNCTION dbo.GetNumbersInRange(@Min INT, @Max INT)
RETURNS @trackingItems TABLE (Number INT)
AS BEGIN
DECLARE @counter INT = @Min
WHILE (@counter <= @Max)
BEGIN
INSERT INTO @trackingItems (Number) SELECT @counter
SELECT @counter = @counter + 1
END
RETURN
END
GO
作为一个例子,我设置了一个包含一些数字(带有间隙)的表
CREATE TABLE MyNumbers (Number INT)
INSERT INTO MyNumbers (Number)
SELECT 1
UNION
SELECT 2
UNION
SELECT 4
UNION
SELECT 5
UNION
SELECT 7
UNION
SELECT 8
要查找丢失的数字,您可以使用LEFT JOIN
这样的
SELECT
AllNumbers.Number
FROM GetNumbersInRange(1, 10) AS AllNumbers
LEFT JOIN MyNumbers ON AllNumbers.Number = MyNumbers.Number
WHERE MyNumbers.Number IS NULL