如何解决在同一层次结构中不同类之间的django ORM语法中使用UNION
|| 我需要实现类似 (SELECT table1.*,val=2 FROM table1 INNER JOIN table2 ON table1.id = table2.id WHERE some_condition)
UNION
(SELECT table1.*,val=3 FROM table1 INNER JOIN table3 ON table1.id = table3.id WHERE some_condition)
要么
(SELECT val1,val2,val3,val=2 FROM table2 WHERE some_condition)
UNION
(SELECT val1,val=3 FROM table3 WHERE some_condition)
即具有类\'table1 \',\'table2 \'和\'table3 \',其中table2和table3从table1派生,我需要选择所有具有附加字段的字段。问题是我宁愿避免使用原始sql查询,因为some_condition应该可重用。如果我尝试使用多余的内容,它会抱怨我使用.extra
。
解决方法
如果您尝试在
.execute
调用之外编写JOIN
/UNION
,您将花费大量时间与django ORM API战斗。如果这很普遍,请考虑使用VIEW
,然后从新创建的VIEW
中简单执行SELECT
。
, 您可以将其重写为子查询:
select val1,val2,val3,val4
from (
SELECT val1,val=2 as val4 FROM table2
UNION
SELECT val1,val=3 as val4 FROM table3
) t
where some_condition
但是要当心,因为这不一定是最好的事情。
之所以令人满意,是因为您避免了重写条件,但是对于查询计划者而言,这两个查询可能是完全不同的动物。 Postgres有时足够聪明,可以将条件注入子语句中,但是我从未见过的一种情况是,当子语句具有任何类型的汇总时。
具体来说,如果条件位于外部(如上所示),则将从附加两个完整表开始。然后,您将对它们进行汇总以消除重复(此操作可以通过使用union all
而不是union
来避免,btw可以避免),最后您将过滤出结果集中符合条件的行。
相比之下,当放置在各个位中时,您将追加并排序两组较小的行。这样会更快并且消耗更少的内存。
简而言之,请尽早在查询中过滤行。
, 我决定移植到sqlalchemy-我的问题很不适合django,而我对tg2感到更高兴(这表示-并不意味着django不好-它只是不太适合我的任务)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。