哪里存在 & 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`