Tha*_*Guy 4 python mysql outer-join flask flask-sqlalchemy
最初,我尝试进行“右外部联接”,但是一旦发现不被支持,我便开始着手从左侧来。但是,我在弄清楚如何编写所需的内容时遇到了麻烦。本质上,我有两个表,Table_1并且Table_2需要Table_1where 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
Run Code Online (Sandbox Code Playgroud)
这就是我用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;
Run Code Online (Sandbox Code Playgroud)
这就是Flask-SQLAlchemy形式的内容,请务必注意,这是db.Model类中的方法Table_2。
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()
Run Code Online (Sandbox Code Playgroud)
不幸的是,我在编写它时并没有考虑它,因为它无法从类窗体中调用该方法,所以它实际上并不能那样工作。在初始化仅来自单行的查询之后,我将不得不这样做,这不是我所需要的。我知道我可以像这样将其作为查询运行:
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()
Run Code Online (Sandbox Code Playgroud)
但是我试图出于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);
Run Code Online (Sandbox Code Playgroud)
这在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()
Run Code Online (Sandbox Code Playgroud)