连接Sqlalchemy C中的可选别名

2024-09-29 00:13:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图对两个表进行左连接:invoices和vendors。典型的问题是,我在右边的表(vendors)中有多个条目,这会导致重复的结果:

    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

我在找这个:

^{pr2}$

但我得到的是:

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

所以我正在尝试下面的代码在一个可选的in sqlalchemy核心上连接,但是我得到了一个Not an executable子句错误。由于数据库的设置方式,我不能使用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)

Tags: nameidapplelinelabelinvoicestwobill
1条回答
网友
1楼 · 发布于 2024-09-29 00:13:55

首先,将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 = 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)

相关问题 更多 >