【问题标题】:Joining an aliased selectable in Sqlalchemy Core在 Sqlalchemy Core 中加入别名可选
【发布时间】:2017-01-09 23:13:53
【问题描述】:

我正在尝试在两个表上进行左连接:发票和供应商。典型的问题是我在右表(供应商)中有多个条目,导致结果重复:

    Vendors             Invoices    
    vend_id name        vend_id  line_amt
     001    Lowes       001      5.95
     001    lowes       002      17
     001    Lowes_ca    002      25
     002    Bills       002      40
     002    Bill's      003      4.35
     003    Two Alphas  003      3.75
     004    Apple Cartz 003      10
                        004      23
                        004      56
                        004      80

我正在寻找这个:

Desired Result:     
vend_id   line_amt      name
001       5.95          Lowes
002       17            Bills
002       25            Bills
002       40            Bills
003       4.35          Two Alphas
003       3.75          Two Alphas
003       10            Two Alphas
004       23            Apple Cartz
004       56            Apple Cartz
004       80            Apple Cartz

但我得到了这个:

vend_id   line_amt      name
001       5.95          Lowes
001       5.95          lowes
001       5.95          Lowes_ca
002       17            Bills
002       17            Bill's
002       25            Bills
002       25            Bill's
002       40            Bills
002       40            Bill's
003       4.35          Two Alphas
003       3.75          Two Alphas
003       10            Two Alphas
004       23            Apple Cartz
004       56            Apple Cartz
004       80            Apple Cartz

所以我正在尝试使用下面的代码加入 sqlalchemy 核心中的一个可选择项,但我收到 Not an executable Clause 错误。由于数据库的设置方式,我无法使用 ORM。有没有办法更改此代码或我没有想到的更好的解决方案?

conn = engine.connect()

a = select([vendors.c.vend_id.label('vend_id'),
func.min(vendors.c.name).label('name')]).group_by(vendors.c.vend_id).alias('a')

s = select([
        invoices.c.vend_id.label('vendor'),
        invoices.c.line_amt.label('amount'),
        ]).join(a, a.c.vend_id == invoices.c.vend_id)

p = conn.execute(s)

【问题讨论】:

  • 1.没有“内左连接”之类的东西。 2. 你能发布完整的堆栈跟踪吗?
  • 谢谢,上面更新了。
  • 如果你想加入,你需要.select_from。查看示例here
  • 那行得通,所以只需要重新排列连接到另一个变量。感谢您的帮助。

标签: python join sqlalchemy core


【解决方案1】:

首先将 invoices 表连接到别名表即可。我需要使用.select_from 才能完成加入。这是有效的代码:

 conn = engine.connect()

    a = select([vendors.c.vend_id.label('vend_id'),
    func.min(vendors.c.name).label('name')]).group_by(vendors.c.vend_id).alias('a')

    j = invoices.join(a, a.c.vend_id == invoices.c.vend_id)

    s = 选择([
            invoices.c.vend_id.label('vendor'),
            a.c.name.label('name'),
            invoices.c.line_amt.label('amount'),
            ]).select_from(j)

    p = conn.execute(s)

【讨论】:

    猜你喜欢
    • 2020-06-08
    • 2014-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-08
    • 2011-07-18
    • 2017-01-20
    • 2018-12-06
    相关资源
    最近更新 更多