2013-03-23 88 views
3

我需要對以下2個表A和B執行雙外連接,以使用SQLAlchemy ORM或SQL表達式獲得呈現結果 。sqlalchemy和雙外連接

表B應該外部連接兩次,以便連接2個用於相同A記錄的結果集(由c_id區分)。外連接用於獲取NULL,其中B結果在第一個(c_id = 66)或第二個(c_id = 70)外連接中缺失。

一個表:

id 
-- 
1 
2 
3 
4 

乙表:

id | a_id | c_id 
---+------+------ 
1 | 1 | 66 
2 | 2 | 66 
3 | 3 | 70 
4 | 4 | 66 
5 | 4 | 70 

查詢的結果應該是:

a_id | b1_id (66) | b2_id (70) 
-----+------------+----------- 
1 | 1   | NULL 
2 | 2   | NULL 
3 | NULL  | 3 
4 | 4   | 5 

我到正確的原始SQL查詢看起來如下觀點:

SELECT 
    A.id AS a_id, 
    B_1.id AS b1_id, 
    B_2.id AS b2_id, 
FROM 
    A 
LEFT OUTER JOIN B AS B_1 ON A.id = B_1.a_id AND B_1.c_id = 66 
LEFT OUTER JOIN B AS B_2 ON A.id = B_2.a_id AND B_2.c_id = 70 
WHERE 
    B_1.id is not NULL or 
    B_2.id is not NULL; 

現在,你知道如何使用SA ORM或SA SQL表達式來編碼嗎?

回答

5

找到解決自己:

b1 = aliased(B) 
b2 = aliased(B) 
q = session.query(A.id, b1.id.label("b1_id"), b1.id.label("b2_id")) 
q = q.outerjoin(b1, sqlalchemy.and_(A.id == b1.a_id, b1.c_id == 66)) 
q = q.outerjoin(b2, sqlalchemy.and_(A.id == b2.a_id, b2.c_id == 70)) 
q = q.filter(sqlalchemy.or_(b1.id != None, b2.id != None))