Выдача подзапроса в FROM в Django
Я пытаюсь создать SQL следующим образом:
SELECT ...
FROM bigtable
INNER JOIN (
SELECT DISTINCT key
FROM smalltable
WHERE smalltable.x = 'user_input'
) subq ON bigtable.key = subq.key
Я попробовал несколько вещей с Django, и на данный момент у меня получилось:
subq = Smalltable.objects.filter(x='%s').values("key").distinct("key")
queryset = Bigtable.objects.extra(
tables=[f"({subq.query}) subq"],
where=["bigtable.key = smalltable.key"],
params=["user_input"],
)
Целью здесь является перекрестное соединение bigtable и DISTINCT smalltable. Предложение ON затем заменяется условием в WHERE. Другими словами, действительное внутреннее соединение старой школы.
И у Django это почти получилось. Он производит SQL следующим образом:
SELECT ...
FROM bigtable, "(SELECT DISTINCT ...) subq"
WHERE (bigtable.key = subq.key)
Обратите внимание на двойные кавычки - Django ожидает табличный литерал только там и экранирует его как таковой. Как я могу выполнить этот запрос, таким или другим способом? Для меня важно, чтобы это было именно соединение, а не IN или EXISTS для целей планирования запроса.