为什么我不能在 sqlite3 中使用 WITH 语句?

abn*_*abn 3 python sql sqlite

我正在尝试在 sqlite3 中执行以下查询:

WITH
    MATCHES AS(
        SELECT      CSV2.*
                    , CSV1.ROW as ROW_1
                    , CSV1.C4 as C4_1
                    , CSV1.C5 as C5_1
        FROM        CSV2
        LEFT JOIN   CSV1
        ON          CSV1.C4 LIKE '%' || CSV2.C2 || '%'
    ),
    EXACT AS(
        SELECT      *
        FROM        MATCHES
        WHERE       C4_1 = C5_1
    ),
    MIN_ROW AS(
        SELECT      C1
                    , min(ROW_1) as ROW_1
        FROM        MATCHES
        WHERE       C1 NOT IN (SELECT C1 FROM EXACT)
        GROUP BY    C1, C2, C3, C4, C5
    )
    SELECT      *
    FROM        EXACT
    UNION
    SELECT      MATCHES.*
    FROM        MIN_ROW
    INNER JOIN  MATCHES
    ON          MIN_ROW.C1 = MATCHES.C1
    AND         (MIN_ROW.ROW_1 = MATCHES.ROW_1 OR MIN_ROW.ROW_1 IS NULL)
    ORDER BY    C1
Run Code Online (Sandbox Code Playgroud)

但是我在“WITH”语句附近收到一个语法错误。

我正在使用 Python 和以下版本执行查询:

sqlite3.version 是 2.6.0 和 sqlite3.sqlite_version 是 3.6.21

aba*_*ert 5

sqlite3.version 给了我 2.6.0 和 sqlite3.sqlite_version 给了 3.6.21。我不知道为什么它有两个不同的版本。我正在研究 Python 2.7。

文档中解释了“为什么” :第一个是 Pythonsqlite3模块的版本(或者,更确切地说,pysqlite是 stdlib 模块跟踪的单独开发的模块);第二个是 Python(或pysqlite)所针对的 SQLite 库本身的版本号。Python 几乎可以针对任何版本的sqlite.*进行构建,因此,您可以使用带有 SQLite 3.2 的 Python 2.7.9 或带有 SQLite 3.8 的 2.7.5。

大多数 Windows 用户使用官方 Python 二进制版本,而不是自己构建它。这些通常具有最新版本,但如果您使用的是古老的二进制文件,则它可能是使用古老的sqlite.

这就是这里的关键。如果您查看更改日志,您可以看到“添加了对公用表表达式和 WITH 子句的支持”直到 3.8.3 才发生,而您使用的是 3.6.21。

那么,您有哪些选择?

  • 获取使用 sqlite 3.8.3 或更高版本构建的更新的 Python 二进制文件。我认为当前的 Windows 2.7.9 官方二进制文件应该符合条件。
  • 自己针对较新的 sqlite 构建 Python。
  • pysqlite使用 sqlite 3.8.3 或更高版本获取或构建第三方模块,并使用pysqlite.sqlite3而不仅仅是sqlite3. 我假设Christoph Gohlke存储库中的包足够新,但我不保证。

* 好吧,3.0 或更高版本。有一段时间,如果您尝试针对 3.0-3.4 进行构建,Python 2.7 会被破坏,但他们有意修复了该问题,以允许人们使用他们平台的古老 sqlite 构建最新的 Python。