如何在 django ORM 的 From 子句中编写子查询

Moh*_*han 7 django postgresql django-models django-orm django-rest-framework

我想使用 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;
Run Code Online (Sandbox Code Playgroud)

我当前的 ORm 查询

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

Run Code Online (Sandbox Code Playgroud)

上面的ORM查询集大致翻译为内部查询

SELECT depname, empno, salary, enroll_date,
          rank() OVER (PARTITION BY depname ORDER BY salary DESC) AS pos
     FROM empsalary
Run Code Online (Sandbox Code Playgroud)

我想知道如何在外部查询的 FROM 子句中获取整个内部查询。

dir*_*ten 2

事实上,不可能WindowWHERE子句中使用查询。因此,请使用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')
Run Code Online (Sandbox Code Playgroud)

  • 它没有作用。子查询放在外查询的WHERE子句中。有没有办法让 SUBQUERY 进入 FROM 子句? (2认同)