子查询中的 sqlalchemy 表冒泡到外部查询中

Posted

技术标签:

【中文标题】子查询中的 sqlalchemy 表冒泡到外部查询中【英文标题】:sqlalchemy table from subquery bubbling up into outer query 【发布时间】:2017-02-09 23:10:56 【问题描述】:

事实:

我正在编写一个使用子查询的 sqlalchemy 查询。 查询正在尝试提取一些用户信息,而子查询提供了一些其他表的计数,这些表我正在尝试加入外部表。 我期望的结果是一个用户名,其中包含付款表中的计数。

我的问题是,第一个 FROM 子句引用了“付款”,当它没有理由包含在发出的 SQL 中时,它出现在内部查询中。

为什么 SQL alchemy 会将内部表中的引用拉到外部表中?

发出的 SQL

SELECT users.name , anon_1.count  
FROM payment, users 
LEFT OUTER JOIN (
  SELECT count(payment.creator_id) AS count, payment.creator_id AS creator_id 
  FROM payment 
  INNER JOIN accounts ON accounts.id = payment.account_id 
  INNER JOIN companies ON companies.id = accounts.company_id 
  WHERE payment.approver_id IS NOT NULL 
  GROUP BY creator_id
) AS anon_1 
ON users.id = anon_1.creator_id 

Python

subquery = self.db.query(*[func.count(Payment.creator_id).label('count'),     
Payment.creator_id.label('creator_id')]). \
        join(Account, Account.id == Payment.account_id). \
        join(Company, Company.id == Account.company_id). \
        filter(Payment.approver_id != None). \
        group_by('creator_id'). \
        subquery()

query = self.db.query(*[func.concat(User.last_name, User.first_name), sub.c.count]). \
        outerjoin(subquery, User.id == sub.c.creator_id)

编辑 1

我发现我可以从子查询中删除两个连接和过滤器,问题仍然存在。

【问题讨论】:

【参考方案1】:

我找到了答案。稍后在代码中的某处,将过滤器添加到查询中。

【讨论】:

以上是关于子查询中的 sqlalchemy 表冒泡到外部查询中的主要内容,如果未能解决你的问题,请参考以下文章

SQLAlchemy - 将子查询的模式和数据复制到另一个数据库

简单子查询的混淆 SQLAlchemy 转换

SQLAlchemy:排除从查询的子查询中获取的行

如何在子查询中使用外部查询中的列从另一个表中获取结果?

SQLAlchemy - WHERE 子句中的子查询

您如何设置 sqlalchemy 关系ihp,以便子查询负载将根据属性过滤我们的结果