我讀過幾篇文章,說一個普通程序員犯的一個錯誤是沒有使用SQL的潛力,從那時起我開始用SQLish解決方案替換部分代碼,而不是提取數據和處理用編程語言,雖然我是一個真正的SQL新手。在範圍中查找缺少的數值
說我有一個隨機填充值從0到10的表,我想知道哪些值在此範圍內丟失。例如,表格由以下值組成:0, 1, 3, 4, 5, 7, 8, 9
。
查詢應該會返回:2, 6, 10
。
我讀過幾篇文章,說一個普通程序員犯的一個錯誤是沒有使用SQL的潛力,從那時起我開始用SQLish解決方案替換部分代碼,而不是提取數據和處理用編程語言,雖然我是一個真正的SQL新手。在範圍中查找缺少的數值
說我有一個隨機填充值從0到10的表,我想知道哪些值在此範圍內丟失。例如,表格由以下值組成:0, 1, 3, 4, 5, 7, 8, 9
。
查詢應該會返回:2, 6, 10
。
[F5]溶液(假設SQL服務器):
-- 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
爲什麼'where 1 = 1'? – DrCopyPaste
@DrCopyPaste只是我的習慣:)。 –
這就是我的想法,但它起源於哪裏?是否有一些非常罕見的情況會給你帶來巨大的好處?只是好奇,也許值得采用這種習慣:D – DrCopyPaste
此解決方案使用SQL-Server的語法(但據我所知只有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
IDK什麼級別的編程你,但如果你願意的接受一些建議我可以保證你會遇到這樣的問題:「我開始尋找用SQLish解決方案替換部分代碼」。 –
它是哪個數據庫系統? – Szymon