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