在同一层次结构中不同类之间的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不好-它只是不太适合我的任务)。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...