7

SQLAlchemy ORM または SQL 式を使用して提示された結果を取得するには、次の 2 つのテーブル A と B で二重外部結合を行う必要があります。

テーブル B は、同じ A レコードに対する結合された 2 つの結果セット (c_id によって区別される) を取得するために、2 回外部結合する必要があります。外部結合は、最初 (c_id = 66) または 2 番目 (c_id = 70) の外部結合で B の結果が欠落している NULL を取得するために使用されます。

テーブル:

id
--
1
2
3
4

B テーブル:

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 式でコーディングする方法を知っていますか?

4

1 に答える 1

9

自分で解決策を見つけました:

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))
于 2013-03-27T06:08:42.510 に答える