使用mariadb版本10.5.15(以及带有python 3.9的SQLAlchemy)。在使用count == 3过滤以下表后,我将获得ID为
第2、3、4、7和12段。
如果第2、3、4、7或12行具有相同的group_id(不包括空值),但具有不同的group_leader值,则对于这些行中的每一行,我希望添加(同一表的)每一行。
(same group_id,不是相同的group_leader)1,3(来自id 2)5(来自id 4)10(来自id 7且仅来自id 10,因为group_leader必须不同)
| 标识符|计数器|组标识|组长|
| - -|- -|- -|- -|
| 一个|七个|一个|零值|
| 2个|三个|一个|一个|
| 三个|2个|一个|零值|
| 四个|三个|2个|一个|
| 五个|六个|2个|零值|
| 六个|2个|三个|零值|
| 七个|三个|三个|零值|
| 八个|一个|三个|零值|
| 九个|2个|三个|零值|
| 10个|五个|三个|一个|
| 十一|五个|零值|零值|
| 十二个|三个|零值|零值|
有没有可能先从..................................................................................................................................................................................................
这是一个实际的例子:
def query_positions(position_filter: dict):
result = db.session.query(Positions).join(
ProjectCrafts, Positions.project_craft_id == ProjectCrafts.project_craft_id).join(
Projects, Positions.project_id == Projects.project_id
)
if "firm_id" in position_filter:
result = result.filter(Positions.firm_id == position_filter["firm_id"])
if "craft" in position_filter:
result = result.filter(ProjectCrafts.craft == position_filter["craft"])
if "craft_name" in position_filter:
result = result.filter(ProjectCrafts.craft_name == position_filter["craft_name"])
positions1 = aliased(Positions)
result = result.join(positions1, Positions.is_parent == 1, Positions.family_id == positions1.family_id).join(
Positions.family_id == positions1.family_id)
positions = result.all()
return positions
这个问题出现在positions1 = aliased(Positions)
之后,我得到了这个错误
...
在连接确定中,隐式左侧引发sa_exc.无效请求错误(sqlalchemy.exc.无效请求错误:不知道如何在0x 7 fabd 1ad 30加入〈别名检查; Positions(Positions)〉。请使用.select_from()方法来建立显式左侧,并提供显式ON子句(如果尚未提供)以帮助解决歧义。
1条答案
按热度按时间fkvaft9z1#
您可以将count_上的筛选数据表与原始数据表链接,并在原始数据表中加入两个主要条件:
然后在两个结果集之间应用
UNION
,可以选择在后面跟一个ORDER BY
子句,以便对id上的值进行排序。假设NULL值和NON-NULL值既不相等也不不同,比较它们的一种方法是使用
COALESCE
函数将NULL值转换为-1
(假设“group_leader”值不能使用此值)。检查演示here。