加入Sqlalchemy Core中的别名可选择

时间:2016-09-01 23:18:10

标签: python join sqlalchemy core

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

    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 a executable子句错误。由于db的设置方式,我无法使用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 个答案:

答案 0 :(得分:1)

首先将发票表连接到别名表将起作用。我需要使用.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 = select([
            invoices.c.vend_id.label('vendor'),
            a.c.name.label('name'),
            invoices.c.line_amt.label('amount'),
            ]).select_from(j)

    p = conn.execute(s)