在 Sqlalchemy Core 中加入可选的别名
Joining an aliased selectable in Sqlalchemy Core
我正在尝试对两个 table 进行左连接:发票和供应商。典型的问题是我在右边有多个条目 table (供应商)导致重复结果:
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 核心中的 selectable,但我收到了 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)
首先将发票 table 加入别名 table 即可。我需要使用 .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)
我正在尝试对两个 table 进行左连接:发票和供应商。典型的问题是我在右边有多个条目 table (供应商)导致重复结果:
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 核心中的 selectable,但我收到了 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)
首先将发票 table 加入别名 table 即可。我需要使用 .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)