Python 在同一层次结构中的不同类之间使用django ORM语法中的并集
我需要实现类似于Python 在同一层次结构中的不同类之间使用django ORM语法中的并集,python,sql,django,postgresql,django-models,Python,Sql,Django,Postgresql,Django Models,我需要实现类似于 (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) 或 也就是说,有“table1”、“table2”和“ta
(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)
或
也就是说,有“table1”、“table2”和“table3”类,其中table2和table3是从table1派生的,我需要用附加字段选择所有这些类。问题是我宁愿避免使用原始sql查询,因为某些条件应该是可重用的。如果我尝试使用extra,它会抱怨我使用了
。extra
您可以将其重写为子查询:
select val1, val2, val3, val4
from (
SELECT val1, val2, val3, val=2 as val4 FROM table2
UNION
SELECT val1, val2, val3, val=3 as val4 FROM table3
) t
where some_condition
但是要小心,因为这不一定是最好的做法
这可能令人满意,因为您避免了重写条件,但对于查询计划器来说,这两个查询可能非常不同。Postgres有时非常聪明,可以将where条件注入子语句,但有一种情况我从未见过它这样做,那就是子语句具有任何类型的聚合
具体地说,如果条件放在外部(如上所述),您将从附加两个完整的表开始。然后,您将聚合它们以消除重复项(这是一个步骤,您可以通过使用union all
而不是union
,来避免此步骤),并且您将最终筛选结果集中与您的条件匹配的行
相反,当放置在单个位中时,您将追加两组较小的行并对其排序。它将更快,占用更少的内存
简而言之,在查询中尽可能早地筛选行。您可以将其重写为子查询:
select val1, val2, val3, val4
from (
SELECT val1, val2, val3, val=2 as val4 FROM table2
UNION
SELECT val1, val2, val3, val=3 as val4 FROM table3
) t
where some_condition
但是要小心,因为这不一定是最好的做法
这可能令人满意,因为您避免了重写条件,但对于查询计划器来说,这两个查询可能非常不同。Postgres有时非常聪明,可以将where条件注入子语句,但有一种情况我从未见过它这样做,那就是子语句具有任何类型的聚合
具体地说,如果条件放在外部(如上所述),您将从附加两个完整的表开始。然后,您将聚合它们以消除重复项(这是一个步骤,您可以通过使用union all
而不是union
,来避免此步骤),并且您将最终筛选结果集中与您的条件匹配的行
相反,当放置在单个位中时,您将追加两组较小的行并对其排序。它将更快,占用更少的内存
简而言之,在查询中尽可能早地筛选行。如果您试图在
之外编写此JOIN
/UNION
。执行调用,您将花费大量时间与django ORM API进行斗争。如果这将是非常常见的,考虑使用A,然后只需从新创建的<代码>视图>代码> > < /p> <代码> >您将花费大量时间与Django Orm API打交道,如果您试图在代码< >中写入此代码>连接< /代码> /<代码>联合< /代码>。执行<代码/>调用。如果这将是非常普遍的,考虑使用A,然后只需从新创建的<代码>视图>代码>中选择一个简单的<代码> > />代码> 我决定将其移植到SqLalCyy——我的问题很难适应Django,并且我对TG2更满意(也就是说,这并不意味着Django是坏的——它不适合我的任务)。.我决定移植到sqlalchemy——我的问题非常适合django,我更喜欢tg2(也就是说——这并不意味着django不好——它只是不太适合我的任务)。在这个查询中重复某些条件
没有问题——问题是1。它用于许多其他查询,可能返回大数据集,因此我不想将其缓存在内存2中some_condition
本身在其他查询中使用。此查询中的some_condition
复制没有问题-问题是1。它用于许多其他查询,可能返回大数据集,因此我不想将其缓存在内存2中<代码>某些条件
本身用于其他查询。