Kueri SQL dengan Python memberikan kesalahan sintaksis OperationalError: near WITH:

Saya telah mencoba melakukan beberapa penggabungan file CSV menggunakan SQL dengan Python dengan kueri SQL sebagai berikut:

WITH
MATCHES AS( -- get all matches
    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( -- matches where CSV1.C4 = CSV1.C5
    SELECT      *
    FROM        MATCHES
    WHERE       C4_1 = C5_1
),
MIN_ROW AS( -- CSV1.ROW of first occurence for each CSV2.C1
    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                  
)
-- use C4=C5 first
SELECT      *
FROM        EXACT
UNION
-- if match not in exact, use first occurence
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

Namun, saya terus menerima kesalahan sintaksis OperationalError: near "WITH":. Saya tidak terlalu paham dengan SQL dan belum pernah mencoba menggunakannya dengan Python sebelumnya. Apa yang bisa dilakukan untuk memperbaiki kesalahan ini? Pembaruan1- Kueri dalam pasangan tanda kurung pertama berfungsi dengan baik tanpa bagian "dengan kecocokan sebagai". Berikut contoh file csv: CSV1

data13      data23      d      main_data1;main_data2      data13         data23
data12      data22      d      main_data1;main_data2      data12         data22
data11      data21      d      main_data1;main_data2      data11         data21
data3       data4       d      main_data2;main_data4      data3          data4
data52      data62      d      main_data3                 data51         data62
data51      data61      d      main_data3                 main_data3     data61
data7       data8       d      main_data4                 data7          data8

CSV2

id1      main_data1      a1      a2      a3
id2      main_data2      b1      b2      b3
id3      main_data3      c1      c2      c3
id4      main_data4      d1      d2      d3
id5      main_data5      e1      e2      e3

dan kode Python

import csv
import sqlite3

def createTable(cursor, rows, tablename):
    tableCreated = False
    for row in rows:
        if not tableCreated:
            sql = "CREATE TABLE %s(ROW INTEGER PRIMARY KEY, " + ", ".join(["c%d" % (i+1) for i in range(len(row))]) + ")"
            cur.execute(sql % tablename)
            tableCreated = True
        sql = "INSERT INTO %s VALUES(NULL, " + ", ".join(["'" + c + "'" for c in row]) + ")"
        cur.execute(sql % tablename)
    conn.commit()


conn = sqlite3.connect(":memory:")
cur = conn.cursor()

for filename, tablename in [(path_to_csv1, "CSV1"), (path_to_csv2, "CSV2")]:
    with open(filename, "r") as f:
        reader = csv.reader(f, delimiter=',')        
        rows = [row for row in reader]
    createTable(cur, rows, tablename)

Pembaruan2- Saya menggunakan Python 2.7


person abn    schedule 04.12.2014    source sumber


Jawaban (2)


Klausa WITH didukung sejak SQLite 3.8.3. Versi yang dikirimkan dengan Python 2.7 jauh lebih tua.

Perbarui ke Python terbaru, atau gunakan driver database lain seperti apsw, atau, jika Python dikompilasi dengan perpustakaan dinamis, coba ganti file perpustakaan SQLite.

person CL.    schedule 04.12.2014
comment
+1: Menaikkan sqlite ke 3.21.0 memecahkan masalah ini untuk saya. -1: sqlite bukan bagian dari Python. Lihat stackoverflow.com/a/1553190/2166224 . - person kidmose; 12.01.2018

Menambahkan ';' sebelum With sebagai

;WITH
MATCHES AS( ...
person Deepshikha    schedule 04.12.2014
comment
Terima kasih atas tanggapannya. Namun kesalahan masih terjadi. - person abn; 04.12.2014
comment
Apakah itu mysql/T-sql atau apa? - person Deepshikha; 04.12.2014