【问题标题】:cross join in sqlalchemy 1.3sqlalchemy 1.3中的交叉连接
【发布时间】:2019-03-09 13:25:26
【问题描述】:

我不明白如何使用交叉联接来连接两个表。 Earler,在 sqlalchemy 版本 1.1.4 我这样做:

A = Table1.sa 
B = Table2.sa
my_query = A.query().join(B, literal(True))

但更新到 1.3 版后,它会引发异常:

sqlalchemy.exc.InvalidRequestError: 无法确定从哪个 FROM 子句加入,有多个 FROM 可以加入此实体。尝试添加明确的 ON 子句来帮助解决歧义。

我明白这意味着我必须这样做:

my_query = A.query().join(B, A.fireign_key_id = B.id)

但是表 A 没有表 B 的外键。

如何使用交叉连接和没有外键连接两个表? 谢谢。

【问题讨论】:

  • 请添加模型ABTable1.sa等的定义。

标签: python sqlalchemy


【解决方案1】:

感谢您的所有回答。引发异常,因为查询无法确定剩下哪个表,进入查询(...)使用表 B 的字段。在我明确指出左表后,此异常消失了。

my_query = A.query(...).join(B, A.id != None)

【讨论】:

  • 如果您还需要其他表中的数据,您可能需要执行.with_entities(A, B.columns.some_column)之类的操作
【解决方案2】:

进行交叉连接的最简单方法是从两个表中进行选择,而不提供任何过滤器来执行 ANSI 连接:

my_query = session.query(A, B)

这将生成您的 A 和 B 实体的笛卡尔积(交叉连接),无需变通方法。

【讨论】:

    【解决方案3】:

    交叉连接不使用连接条件,因此Table1Table2 之间不能有任何 ON。在交叉连接中,来自T1 的每一行与来自T2 的所有行连接。您确定要使用交叉连接吗?

    【讨论】:

    • JOIN foo ON true 实际上是一个交叉连接,尽管没有明确写成一个。
    • 交叉连接本身并不应用任何谓词来过滤连接表中的行。可以使用 WHERE 子句过滤交叉连接的结果,然后该子句可能会产生等效的内部连接。 en.wikipedia.org/wiki/Join_%28SQL%29#Cross_join 好的,我们也可以用 ON 代替 WHERE,结果是一样的,但是为了什么呢?
    • 请注意“有效”二字。上述内连接的结果完全等于交叉连接产生的关系,也可以使用WHERE 子句进一步选择结果。另一方面,简单的方法是仅以 SQL-92 之前的样式列出 FROM 项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-01
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 2011-07-20
    • 2013-07-11
    相关资源
    最近更新 更多