【问题标题】:How to solve cursor-based SQL task on SQLite?如何解决 SQLite 上基于游标的 SQL 任务?
【发布时间】:2015-02-02 06:56:26
【问题描述】:

我最近有一个 SQL 任务的面试,这需要使用游标,但必须为 doesn't have 游标的 SQLite 编写代码。那么,我该如何解决呢?任务如下:

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 编写相同的代码?我问了我的朋友,没有人知道。 我多次尝试解决这个任务,但都没有成功。 一想到这个悬而未决的问题,我就心烦意乱。请帮帮我! 任何帮助表示赞赏。

【问题讨论】:

  • 你从哪里得到+ (7 -5)
  • 我们必须计算覆盖面。例如,从 3 到 5 的表面被第一行和最后一行覆盖 2 次。这意味着我们只能使用 3 到 5 的表面 1 次。

标签: sql sql-server sqlite cursor


【解决方案1】:

SQLite 是一个嵌入式 数据库,也就是说,它被设计为在某些应用程序中使用。您将在代码中处理光标。

无论如何,您并不真的需要迭代算法。

您需要忽略另一行覆盖的所有开始/结束坐标。 假设没有两条线在同一坐标开始/结束,这可以通过简单的 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)
       )

【讨论】:

  • @dyatchenko & CL。好的,明白了。
猜你喜欢
  • 2011-12-11
  • 2014-06-21
  • 1970-01-01
  • 2016-12-29
  • 2022-06-12
  • 2014-05-23
  • 1970-01-01
  • 1970-01-01
  • 2020-05-15
相关资源
最近更新 更多