如何在 SQLite 上解决基于游标的 SQL 任务?
How to solve cursor-based SQL task on SQLite?
我最近参加了 SQL 任务的工作面试,这需要使用游标,但代码必须是为 SQLite doesn't have 游标编写的。那么,我该如何解决呢?任务如下:
Exists a table which has two columns: "b" - the beginning and "e" - the end.
Each row of this table represents 1-dimentional line - column "b"
contains coordinate of the beginning, column "e" - coordinate of
the end. e.g.:
b | e
-------
1 | 5
2 | 4
3 | 7
-------
Column "e" always greater than "b" in each row. It is required to calculate
length of covered surface on coordinate axis. For this example answer
is 6 = ((5 - 1) + (7 - 5)).
这是我的游标解决方案:
DECLARE @temp_table TABLE(b int, e int);
DECLARE [cursor] CURSOR FOR SELECT b, e FROM [table]
DECLARE @b INT
DECLARE @e INT
OPEN [cursor]
FETCH NEXT FROM [cursor] INTO @b, @e
WHILE @@FETCH_STATUS = 0
BEGIN
IF (EXISTS(SELECT * FROM @temp_table))
FETCH NEXT FROM [cursor] INTO @b, @e
IF (EXISTS(SELECT * FROM @temp_table WHERE b <= @b AND e >= @e))
CONTINUE;
IF (EXISTS(SELECT * FROM @temp_table WHERE e < @b OR b > @e)
OR NOT EXISTS(SELECT * FROM @temp_table))
BEGIN
INSERT INTO @temp_table VALUES(@b, @e)
CONTINUE
END
IF (EXISTS(SELECT * FROM @temp_table WHERE b <= @b AND e <= @e))
BEGIN
UPDATE @temp_table SET e = @e WHERE b <= @b AND e <= @e
CONTINUE;
END
IF (EXISTS(SELECT * FROM @temp_table WHERE b >= @b AND e >= @e))
BEGIN
UPDATE @temp_table SET b = @b WHERE b >= @b AND e >= @e
CONTINUE;
END
END
CLOSE [cursor]
DEALLOCATE [cursor]
SELECT SUM(e - b) FROM @temp_table
如何为 SQLite 编写相同的代码?我问过我的朋友,没人知道。
我多次尝试解决这个任务,但都没有成功。
想到这个悬而未决的问题让我心烦意乱。请帮帮我!
感谢任何帮助。
SQLite 是一个嵌入式 数据库,也就是说,它设计用于某些应用程序内部。您将在代码中处理光标。
总之,你真的不需要迭代算法。
您需要忽略所有被另一条线覆盖的 start/end 坐标。
假设没有两条线 start/end 在同一个坐标,这可以用一个简单的 EXISTS 来完成:
SELECT (SELECT SUM(e)
FROM MyTable
WHERE NOT EXISTS (SELECT 1
FROM MyTable AS T2
WHERE T2.e >= MyTable.e
AND T2.b <= MyTable.e
AND T2.rowid <> MyTable.rowid)
) -
(SELECT SUM(b)
FROM MyTable
WHERE NOT EXISTS (SELECT 1
FROM MyTable AS T2
WHERE T2.e >= MyTable.b
AND T2.b <= MyTable.b
AND T2.rowid <> MyTable.rowid)
)
我最近参加了 SQL 任务的工作面试,这需要使用游标,但代码必须是为 SQLite doesn't have 游标编写的。那么,我该如何解决呢?任务如下:
Exists a table which has two columns: "b" - the beginning and "e" - the end.
Each row of this table represents 1-dimentional line - column "b"
contains coordinate of the beginning, column "e" - coordinate of
the end. e.g.:
b | e
-------
1 | 5
2 | 4
3 | 7
-------
Column "e" always greater than "b" in each row. It is required to calculate
length of covered surface on coordinate axis. For this example answer
is 6 = ((5 - 1) + (7 - 5)).
这是我的游标解决方案:
DECLARE @temp_table TABLE(b int, e int);
DECLARE [cursor] CURSOR FOR SELECT b, e FROM [table]
DECLARE @b INT
DECLARE @e INT
OPEN [cursor]
FETCH NEXT FROM [cursor] INTO @b, @e
WHILE @@FETCH_STATUS = 0
BEGIN
IF (EXISTS(SELECT * FROM @temp_table))
FETCH NEXT FROM [cursor] INTO @b, @e
IF (EXISTS(SELECT * FROM @temp_table WHERE b <= @b AND e >= @e))
CONTINUE;
IF (EXISTS(SELECT * FROM @temp_table WHERE e < @b OR b > @e)
OR NOT EXISTS(SELECT * FROM @temp_table))
BEGIN
INSERT INTO @temp_table VALUES(@b, @e)
CONTINUE
END
IF (EXISTS(SELECT * FROM @temp_table WHERE b <= @b AND e <= @e))
BEGIN
UPDATE @temp_table SET e = @e WHERE b <= @b AND e <= @e
CONTINUE;
END
IF (EXISTS(SELECT * FROM @temp_table WHERE b >= @b AND e >= @e))
BEGIN
UPDATE @temp_table SET b = @b WHERE b >= @b AND e >= @e
CONTINUE;
END
END
CLOSE [cursor]
DEALLOCATE [cursor]
SELECT SUM(e - b) FROM @temp_table
如何为 SQLite 编写相同的代码?我问过我的朋友,没人知道。 我多次尝试解决这个任务,但都没有成功。 想到这个悬而未决的问题让我心烦意乱。请帮帮我! 感谢任何帮助。
SQLite 是一个嵌入式 数据库,也就是说,它设计用于某些应用程序内部。您将在代码中处理光标。
总之,你真的不需要迭代算法。
您需要忽略所有被另一条线覆盖的 start/end 坐标。 假设没有两条线 start/end 在同一个坐标,这可以用一个简单的 EXISTS 来完成:
SELECT (SELECT SUM(e)
FROM MyTable
WHERE NOT EXISTS (SELECT 1
FROM MyTable AS T2
WHERE T2.e >= MyTable.e
AND T2.b <= MyTable.e
AND T2.rowid <> MyTable.rowid)
) -
(SELECT SUM(b)
FROM MyTable
WHERE NOT EXISTS (SELECT 1
FROM MyTable AS T2
WHERE T2.e >= MyTable.b
AND T2.b <= MyTable.b
AND T2.rowid <> MyTable.rowid)
)