我试图在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
答案 0 :(得分:4)
sqlite3.version给了我2.6.0而sqlite3.sqlite_version给了我3.6.21。我不知道为什么有两个不同的版本。我正在研究Python 2.7。
“why”是explained in the docs:第一个是Python sqlite3
模块的版本(或者更确切地说,是stdlib模块跟踪的单独开发的pysqlite
模块);第二个是Python(或pysqlite
)构建的SQLite库本身的版本号。 Python可以构建几乎任何版本的sqlite
。*因此,你可以使用SQLite 3.2的Python 2.7.9或SQLite 3.8的2.7.5。
大多数Windows用户使用官方Python二进制版本,而不是自己构建它。这些通常都有一个非常新的版本,但如果您使用的是古老的二进制文件,它可能是用古老的sqlite
构建的。
这就是关键所在。如果查看the changelog,您可以看到“添加对公用表表达式和WITH子句的支持”直到3.8.3才会发生,并且您使用的是3.6.21。
那么,你有什么选择?
pysqlite
模块,并使用pysqlite.sqlite3
而不是sqlite3
。我假设Christoph Gohlke's存储库中的包是新的,但我不会答应。*好吧,3.0或更高版本。有一段时间,如果您尝试针对3.0-3.4进行构建,Python 2.7就会被破坏,但他们故意修复它,以允许人们使用他们平台的古老版本来构建最新的Python。