【问题标题】:Does join combine the same column with same name and data?join 是否将具有相同名称和数据的同一列组合在一起?
【发布时间】:2020-07-12 10:59:41
【问题描述】:

我正在阅读 Miguel Grinberg 的这篇 article,在“加入”部分,我对结果有点困惑。

总结一下我关心的部分,他加入了属于同一表的查询和子查询,条件是它的customer_id 相同

  • 已选择查询:id, customer_id, order_date
  • 已选择子查询:customer_id, max(order_date) AS last_order_date

当他加入时,我期待的是:

id | customer_id | order_data | customer_id | last_order_date
--------------------------------------------------------------

但他的结果是:

id | customer_id | order_data | last_order_date
-----------------------------------------------

从子查询中选择的另一个customer_id 在哪里?

我想确认一下我的理解是否正确,如果 JOIN 具有相同的 NAME 和 VALUE,它也会组合两个 COLUMNS。

【问题讨论】:

  • 编辑您的问题并显示查询。
  • 您只能从orders 表中获取列,因为主查询使用Order.query,它仅返回该表中的所有列。
  • 我曾经再次运行查询,但这次我使用db.session.query(Order, last_orders) 对其进行了重组,并且我能够获得另一个customer_id。正如@GordThompson 所强调的,原始查询仅用于返回Order 表中的列。谢谢!

标签: sql orm sqlalchemy flask-sqlalchemy


【解决方案1】:

文章在应该使用select orders.*, last_orders.last_order_date 的时候使用了select *,这一事实已经让我对文章中的任何其他内容产生了怀疑。

大多数数据库会运行查询并返回带有customer_id 的两列——正如您所建议的那样。但是,访问应用程序中的这两个列会出现问题。他们有相同的名字。因此,这些列可能会以某种方式被省略。

总而言之,这是一个相当糟糕的例子,因为使用窗口函数编写查询要好得多:

select o.*, max(order_date) over (partition by customer_id)
from orders o;

【讨论】:

  • 确实,select * 的使用可能是我感到困惑的原因。并且与查询的 orm 版本生成的原始查询相比,它显式地仅选择了 Order 中的列,而没有从子查询表中选择。因此,它应该改用您建议的select。谢谢!
猜你喜欢
  • 2022-11-10
  • 2021-09-26
  • 1970-01-01
  • 1970-01-01
  • 2023-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-06
相关资源
最近更新 更多