Как написать подзапрос в предложении From в django ORM - PullRequest
2 голосов
/ 26 марта 2020

Я хочу написать этот запрос, используя django orm

SELECT depname, empno, salary, enroll_date
FROM
  (SELECT depname, empno, salary, enroll_date,
          rank() OVER (PARTITION BY depname ORDER BY salary DESC) AS pos
     FROM empsalary
  ) AS ss
WHERE pos < 3;

Мой текущий запрос ORm

EmpSalary.objects.values('depname', 'empno', 'salary', 'enroll_date').annotate(
pos= Window(
                expression=RowNumber(),
                partition_by=[F('depname')],
                order_by=F('salary').desc(),
            )
)

Приведенный выше набор запросов ORM примерно переводится на внутренний запрос

SELECT depname, empno, salary, enroll_date,
          rank() OVER (PARTITION BY depname ORDER BY salary DESC) AS pos
     FROM empsalary

Я хочу знать, как получить весь внутренний запрос в предложении FROM внешнего запроса.

1 Ответ

3 голосов
/ 26 марта 2020

Действительно, невозможно использовать запрос Window внутри предложения WHERE. Поэтому вместо этого используйте Subquery:

from django.db.models import OuterRef, Subquery

top_salaries = EmpSalary.objects.filter(
    depname=OuterRef('depname')
).order_by('-salary')[:3]
result = EmpSalary.objects.filter(
    pk__in=Subquery(top_salaries.values('pk'))
).values('depname', 'empno', 'salary', 'enroll_date')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...