Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在同一层次结构中的不同类之间使用django ORM语法中的并集_Python_Sql_Django_Postgresql_Django Models - Fatal编程技术网

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中<代码>某些条件
本身用于其他查询。