哪里存在 & Select 1 来自 - 在 SQLAlchemy 中
Where exists & Select 1 from - in SQLAlchemy
我正在尝试在 SQLAlchemy
中创建此 MySQL
查询:
SELECT ClientID, TypeID, C, AVG_G
FROM join_table T1
WHERE EXISTS (
SELECT 1 FROM join_table T2 WHERE T2.ClientID = T1.ClientID AND T2.TypeID <> T1.TypeID
)
ORDER BY ClientID, TypeID
;
这是我尝试实现的方式:
T1 = aliased(Join)
T2 = aliased(Join)
return (
session.query(T1.c.ClientID, T1.c.TypeID, T1.c.C, T1.c.AVG_G)
.filter(T1.c.ClientID == T2.c.ClientID, T1.c.TypeID != T2.c.TypeID)
.exists()
.order_by(T1.c.ClientID, T1.c.TypeID)
)
但我收到错误:
AttributeError: Neither 'Exists' object nor 'Comparator' object has an attribute 'order_by'
按照 documentation's 示例,我可能需要将存在的部分取出到另一个 session.query
对象中,只是我不确定这将如何与 where
部分交互.
是的,最好把里面的selectQuery对象取出来放到一个变量里,然后在上面调用.exists()
函数,这样就不用重复那个了select.
我的问题是 SQLAlchemy 非常直观地映射了查询结构,虽然我的查询有两个 WHERE
子句,但我的 SQLAlchemy 版本只有一个 .filter()
调用。
文档也暗示了这一点:
"The EXISTS construct is usually used in the WHERE clause:"
session.query(User.id).filter(q.exists()).scalar()
所以这是解决方案:
T1 = aliased(Join)
T2 = aliased(Join)
S = (
session.query(T1.c.ClientID, T1.c.TypeID, T1.c.C, T1.c.AVG_G)
.filter(T1.c.ClientID == T2.c.ClientID, T1.c.TypeID != T2.c.TypeID)
)
return (
session.query(T1.c.ClientID, T1.c.TypeID, T1.c.C, T1.c.AVG_G)
.filter(S.exists())
.order_by(T1.c.ClientID, T1.c.TypeID)
)
如果您在引擎中设置 echo=true
,您可以检查这是否确实转换为:
SELECT anon_1.`ClientID`, anon_1.`TypeID`, anon_1.`C`, anon_1.`AVG_G`
FROM Join AS anon_1
WHERE EXISTS
(SELECT 1 FROM Join AS anon_2 WHERE anon_1.`ClientID` = anon_2.`ClientID` AND anon_1.`TypeID` != anon_2.`TypeID`)
ORDER BY anon_1.`ClientID`, anon_1.`TypeID`
我正在尝试在 SQLAlchemy
中创建此 MySQL
查询:
SELECT ClientID, TypeID, C, AVG_G
FROM join_table T1
WHERE EXISTS (
SELECT 1 FROM join_table T2 WHERE T2.ClientID = T1.ClientID AND T2.TypeID <> T1.TypeID
)
ORDER BY ClientID, TypeID
;
这是我尝试实现的方式:
T1 = aliased(Join)
T2 = aliased(Join)
return (
session.query(T1.c.ClientID, T1.c.TypeID, T1.c.C, T1.c.AVG_G)
.filter(T1.c.ClientID == T2.c.ClientID, T1.c.TypeID != T2.c.TypeID)
.exists()
.order_by(T1.c.ClientID, T1.c.TypeID)
)
但我收到错误:
AttributeError: Neither 'Exists' object nor 'Comparator' object has an attribute 'order_by'
按照 documentation's 示例,我可能需要将存在的部分取出到另一个 session.query
对象中,只是我不确定这将如何与 where
部分交互.
是的,最好把里面的selectQuery对象取出来放到一个变量里,然后在上面调用.exists()
函数,这样就不用重复那个了select.
我的问题是 SQLAlchemy 非常直观地映射了查询结构,虽然我的查询有两个 WHERE
子句,但我的 SQLAlchemy 版本只有一个 .filter()
调用。
文档也暗示了这一点:
"The EXISTS construct is usually used in the WHERE clause:"
session.query(User.id).filter(q.exists()).scalar()
所以这是解决方案:
T1 = aliased(Join)
T2 = aliased(Join)
S = (
session.query(T1.c.ClientID, T1.c.TypeID, T1.c.C, T1.c.AVG_G)
.filter(T1.c.ClientID == T2.c.ClientID, T1.c.TypeID != T2.c.TypeID)
)
return (
session.query(T1.c.ClientID, T1.c.TypeID, T1.c.C, T1.c.AVG_G)
.filter(S.exists())
.order_by(T1.c.ClientID, T1.c.TypeID)
)
如果您在引擎中设置 echo=true
,您可以检查这是否确实转换为:
SELECT anon_1.`ClientID`, anon_1.`TypeID`, anon_1.`C`, anon_1.`AVG_G`
FROM Join AS anon_1
WHERE EXISTS
(SELECT 1 FROM Join AS anon_2 WHERE anon_1.`ClientID` = anon_2.`ClientID` AND anon_1.`TypeID` != anon_2.`TypeID`)
ORDER BY anon_1.`ClientID`, anon_1.`TypeID`