На самом деле я не знаю, можно ли использовать синтаксис CTE таким образом из Python API. Предполагая, что вы можете , проблема, с которой вы сталкиваетесь, заключается в том, что вы пытаетесь привязать коллекцию к одному заполнителю в запросе. Вместо этого вы можете попробовать связать коллекцию с подготовленным оператором, который имеет правильное число ?
заполнителей.
vals = (1, 2, 3)
vals_clause = '(?)' + ',(?)'*(len(vals)-1)
sql = 'WITH cte(k) AS (VALUES ' + vals_clause + ') '
sql = sql + 'SELECT * FROM t INNER JOIN cte USING(k)'
for row in conn.execute(SQL_QUERY, vals):
print(row)
Запрос SQL, сгенерированный приведенным выше сценарием:
WITH cte(k) AS (VALUES (?),(?),(?))
SELECT * FROM t INNER JOIN cte USING(k)
Вы можете видеть, что мы сгенерировали сколько угодно ?
заполнителей, необходимых для покрытия кортежа, который вы передаете в вызов execute()
.
Если вы не можете использовать Приведенное выше решение, возможно, может быть, что используемый вами API не позволяет использовать CTE. Мы все еще можем перефразировать ваш запрос следующим образом:
SELECT *
FROM t INNER JOIN
(
SELECT 1 AS k UNION ALL
SELECT 2 UNION ALL
SELECT 3
) cte USING(k);
В этом случае мы просто используем формальный подзапрос для вставки значений во временную таблицу. Подход сценариев, который вы использовали бы для генерации вышеупомянутого набора динамических c буквенных значений, идентичен тому, что я уже представил выше.