在我的SQL Server数据库中,我有一些增量记录,有时我在ID增量方面有一些空白。
ID Data Data
9857370 Data (null)
9857371 (null) (null)
9857375 (null) (null)
9857376 (null) (null)
我们可以看到ID增量的差距。
编辑:
我将C#与SQL一起用于ASP.net项目。 使用SQL请求,我在我的数据库中选择Last ID,在C#中选择OleDbDataReader我检查每条记录是否没有(null)(null),就像在我的例子中一样,我减少了我的ID,直到列中有数据。
但是当我在2条记录之间跳转时,我无法查看我的记录。
ID Data Data
9857371 (null) (null)
9857375 (null) (null)
答案 0 :(得分:0)
试试这个。使用Recursive CTE
生成表格中最大ID和最小ID之间的ID。然后使用LEFT join
CTE with table来获取缺失的行。
DECLARE @MaxID INT = (SELECT MAX(ID) FROM Tablename)
DECLARE @MinID INT = (SELECT Min(ID) FROM Tablename)
;WITH CTE
AS (
SELECT @MinID fullid
UNION ALL
SELECT fullid + 1 FROM CTE WHERE fullid < @MaxID
)
SELECT fullid as MissingId FROM CTE
LEFT JOIN dbo.Tablename t on t.ID = CTE.fullid
WHERE t.ID isNULL
GO
答案 1 :(得分:0)
我通常准备好Numbers表,其中只包含一列,所有数字从1到n(n可以在必要时轻松加倍)。然后使用简单查询找到第一个未使用的数字。像:
SELECT TOP 1 NUMBER FROM NUMBERS
WHERE NOT EXISTS (SELECT * FROM TABLE1 WHERE ID = N)
ORDER BY NUMBER
简单且非常快,假设列编号和ID已编入索引。
编辑:如何创建和填充数字表。
CREATE TABLE NUMBERS(NUMBER INT)
GO
INSERT INTO NUMBERS VALUES(1)
每当需要加倍数字(1,2,4,8,......)时执行以下操作
INSERT INTO NUMBERS
SELECT (SELECT MAX(NUMBER) FROM NUMBERS) + NUMBER FROM NUMBERS
答案 2 :(得分:0)
好的,我已经解决了我的问题!
我的问题是访问数据库中的数据但是没有数据的记录(例如9857371和9857375之间)或记录空(9857376(null)(null))。
ID Data Data
9857370 Data (null)
9857371 (null) (null)
9857375 (null) (null)
9857376 (null) (null)
这是我用循环访问数据的代码,希望它能帮助某人
public void main(string url)
{
int var = 0;
string conn = url;
OleDbConnection connexion = new OleDbConnection(conn);
connexion.Open();
OleDbCommand cmd = new OleDbCommand("SELECT ID, DATA1, DATA2 from Database WHERE ID = ( SELECT MAX (ID) -" + var + " FROM Database);", connexion);
OleDbDataReader reader = cmd.ExecuteReader();
reader.Read();
if (connexion.State == ConnectionState.Open)
{
if (!reader.HasRows || (String.IsNullOrEmpty(reader[1].ToString())) && (String.IsNullOrEmpty(reader[2].ToString())))
{
reader.Close();
OleDbDataReader reader2 = cmd.ExecuteReader();
reader2.Read();
Found:
while (!reader2.HasRows || ((String.IsNullOrEmpty(reader2[1].ToString())) && (String.IsNullOrEmpty(reader2[2].ToString()))))
{
var++;
reader2 = fonction(var, url);
reader2.Read();
if (!reader2.HasRows)
{
goto Found;
}
else if (((!String.IsNullOrEmpty(reader2[1].ToString())) || (!String.IsNullOrEmpty(reader2[2].ToString()))))
{
data = reader2[1].ToString() + " " + reader2[2].ToString();
}
else
{
data = "No Data in Database";
}
}
reader2.Close();
}
else
{
data = reader[1].ToString() + " " + reader[2].ToString();
}
}
else
{
data = "Connexion KO";
}
reader.Close();
connexion.Close();
}