2016-09-01 7 views
0

Я пытаюсь сделать левое соединение на двух таблицах: счета-фактуры и поставщики. Типичная проблема заключается в том, что у меня есть несколько записей в правой таблице (продавцы), что приводит к дублировать результаты:Присоединение к псевдониму, выбираемому в ядре Sqlalchemy

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, но я получаю сообщение об ошибке «Исполняемый файл». Я не могу использовать ORM из-за того, как настроен db. Есть ли способ изменить этот код или лучшее решение, о котором я не думаю?

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. Нет такой вещи, как «внутреннее левое соединение». 2. Можете ли вы опубликовать полную трассировку стека? – univerio

+0

Спасибо, обновлено выше. –

+0

Вам нужно сделать '.select_from', если вы хотите сделать соединение. См. Примеры [здесь] (http://docs.sqlalchemy.org/en/latest/core/tutorial.html#using-joins). – univerio

ответ

0

Первое соединение таблицы счетов-фактур с таблицей с псевдонимом будет работать. Мне нужно было использовать .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) 
Смежные вопросы