[英]How to make left outer join with flask-sqlalchemy and solve my case?
[英]Flask-SQLAlchemy Left Outer Join Filtered Query
最初我試圖做一個“正確的外部加入”但是一旦我發現不支持我就開始從左邊開始工作。 但是,我無法弄清楚如何寫出我需要的東西。 基本上我有兩個表, Table_1
和Table_2
,我需要Table_1
中的所有行,其中column_c
等於1
。 另外,我需要Table_2
中的所有行,其中column_b
不在Table 1
。 在視覺上它看起來像這樣:
**Table_1**
column_a ( a and b are the
column_b ( primary key.
column_c
**Table_2**
column_b
這是我在SQL中編寫的方式:
SELECT *
FROM (SELECT * FROM Table_1 WHERE column_a = 123) t1
RIGHT OUTER JOIN Table_2 t2 ON t1.column_b = t2.column_b
WHERE t1.column_c = 1 or t1.column_c is NULL;
SELECT *
FROM Table_2 t2
LEFT OUTER JOIN (SELECT * FROM Table_1 WHERE column_a = 123) t1
ON Table_2 t2 ON t1.column_b = t2.column_b
WHERE t1.column_c = 1 or t1.column_c is NULL;
這就是我在Flask-SQLAlchemy形式中所做的,重要的是要注意這是Table_2
的db.Model類中的一個方法。
def all_exclude(self, column_a):
return self.query.outerjoin(
Table_1,
Table_1.column_b==Table_2.column_b).filter(or_(
Table_1.column_c==None,
and_(Table_1.column_c==1,
Table_1.column_a==column_a))).all()
不幸的是,當我編寫它時,我並沒有考慮它,因為我無法從類表單中調用該方法,所以它不會真正起作用。 初始化一個只能來自單行的查詢后,我必須這樣做,這不是我需要的。 我知道我可以像這樣查詢運行它:
Business.query.outerjoin(
Table_1,
Table_1.column_b==Table_2.column_b).filter(or_(
Table_1.column_c==None,
and_(Table_1.column_c==1,
Table_1.column_a==column_a))).all()
但是我試圖將我的課程分開以用於OOP目的,但即便如此,我認為這不會起作用,因為技術上過濾器在連接之前沒有完成。 也許解決方案比我想象的要容易,但我無法完全理解它。 先感謝您!
根據您的評論,這應該回答您的問題:
SELECT Table_1.column_a, Table_1.column_b
FROM Table_1
WHERE Table_1.column_a = 123
AND Table_1.column_c = 1
UNION
SELECT Table_2.column_a, Table_2.column_b /* I'm assuming these columns exist in Table_2. Make sure these columns are same as selected columns from Table_1 */
FROM Table_2
WHERE NOT EXISTS (SELECT 1 FROM Table_1
WHERE Table_1.column_b = Table_2.column_b
AND Table_1.column_a = 123);
這在Python SQLAlchemy中轉換為:
from sqlalchemy import exists
query_1 = (db.session.query(Table_1)
.with_entities(Table_1.column_a, Table_1.column_b)
.filter(Table_1.column_a == 123)
.filter(Table_1.column_c == 1)
query_2 = (db.session.query(Table_2)
.with_entities(Table_2.column_a, Table_2.column_b)
.filter(
~exists().where(Table_1.column_b == Table_2.column_b)
)
)
query = query_1.union(query_2).all()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.