繁体   English   中英

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

[英]Why can't I use WITH statement in sqlite3?

我正在尝试在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

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

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

sqlite3.version是2.6.0,而sqlite3.sqlite_version是3.6.21

sqlite3.version给了我2.6.0,而sqlite3.sqlite_version给了我3.6.21。 我不知道为什么有两个不同的版本。 我正在使用Python 2.7。

在文档中解释了 “为什么”:第一个是Python sqlite3模块的版本(或者,是stdlib模块跟踪的单独开发的pysqlite模块); 第二个是构建Python(或pysqlite )所依据的SQLite库本身的版本号。 Python可以针对几乎所有版本的sqlite进行构建。*因此,您可以将Python 2.7.9与SQLite 3.2配合使用,或者将2.7.5与SQLite 3.8配合使用。

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

这就是这里的关键。 如果查看changelog ,您会发现直到3.8.3才出现“增加了对公用表表达式和WITH子句的支持”,而您使用的是3.6.21。

那么,您有什么选择呢?

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

*是3.0或更高版本。 有一阵子,如果您尝试针对3.0-3.4进行构建,Python 2.7会被破坏,但他们有意修复了该问题,以使人们能够使用其平台上古老的sqlite构建最新的Python。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM