Я чувствую, что на этот вопрос ответят в другом месте, но хоть убей, я не могу найти правильный поисковый запрос.

У меня есть подзапрос, который выбирает 2 значения: id и MAX(date). Дата требуется для получения последнего значения при использовании GROUP BY, но после этого этапа она не нужна.

Как я могу «отбросить» столбец date, чтобы использовать оператор id IN (subquery)? А пока я выбираю func.max(Model.id), чтобы обойти проблему.

Вот урезанный пример того, что я пытаюсь сделать:

# Get the IDs of each latest link to a relationship
>>> subquery = session.query(Model.id, func.max(Model.date)).group_by(Model.relationship_id)

# Use these IDs as part of another query
>>> query = session.query(Model.id).filter(Model.id.in_(subquery))
sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) sub-select returns 2 columns - expected 1
1
Peter 5 Мар 2021 в 18:15

1 ответ

Лучший ответ

Проблема, с которой вы столкнулись, заключается в том, что ваш подзапрос возвращает 2 столбца -> когда ваш основной запрос ищет идентификатор, он не знает, в каком столбце искать.

Вы можете указать столбец подзапроса для фильтрации с помощью c.column_name:

query = session.query(Model.id).filter(Model.id == subquery.subquery().c.id)

В качестве альтернативы, поскольку ваш подзапрос имеет общий ключ с вашим основным запросом, вы можете выполнить соединение :
(может облегчить вашу жизнь в некоторых сценариях)

# This should work, but if it doesn't, may need to specify "on" param
query = session.query(Model.id).join(subquery.subquery())
0
Yaakov Bressler 8 Мар 2021 в 02:25