如何在Django ORM中编写FROM子句中的子查询 [英] How to write subquery in From clause in django ORM
本文介绍了如何在Django ORM中编写FROM子句中的子查询的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我想使用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子句中获取整个内部查询。
推荐答案
实际上,不可能在WHERE
子句中使用Window
查询。因此,请使用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')
这篇关于如何在Django ORM中编写FROM子句中的子查询的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文