在SqlAlchemy中,我需要实现以下子查询,它在PostgreSQL中运行良好。它是一个OR条件,由2个EXISTS和一个附加AND块组成。整个列将产生一个真/假布尔值
SELECT
...
...
,
(SELECT
(
EXISTS (SELECT id from participating_ic_t pi1 where pi1.id = agreement_t_1.participating_ic_id
AND pi1.ic_nihsac = substr(ned_person_t_2.nihsac, 1, 3))
OR EXISTS (SELECT id from external_people_t ep1 where ep1.participating_ic_id = agreement_t_1.participating_ic_id
AND ep1.uniqueidentifier = ned_person_t_2.uniqueidentifier)
)
AND ned_person_t_2.current_flag = 'Y' and ned_person_t_2.inactive_date is null and ned_person_t_2.organizationalstat = 'EMPLOYEE'
) as ACTIVE_APPROVER1,
首先,如果省略附加AND块,则以下OR-EXISTS本身可以正常工作:
subq1 = db_session.query(ParticipatingIcT.id).filter((ParticipatingIcT.id == agreement.participating_ic_id),
(ParticipatingIcT.ic_nihsac == func.substr(approver.nihsac, 1, 3)))
.subquery()
subq2 = db_session.query(ExternalPeopleT.id).filter((ExternalPeopleT.participating_ic_id == agreement.participating_ic_id),
(ExternalPeopleT.uniqueidentifier == approver.uniqueidentifier))
.subquery()
subqMain = db_session.query(or_(exists(subq1), exists(subq2))
.subquery()
# ...
# Now we will select from subqMain.
agreements = (db_session.query(
..,
subqMain
但是当我介绍最后一个和块时,问题就开始了。从概念上讲,最终结果应如下所示:
subqMain = db_session.query(and_(
or_(exists(subq1), exists(subq2)),
approver.current_flag == 'Y',
approver.inactive_date == None,
approver.organizationalstat == 'EMPLOYEE'))
.subquery()
但是它实际上在子查询的右边发出" .. FROM APPROVER_T"
,而它应该在最末端链接到主查询的FROM APPROVER_T
。我需要避免添加.. FROM [table]
,这会在我指定and_(..)
后立即发生。我不明白它为什么这么做。所有子查询都专门标记为subquery()
。别名approver
在最顶端定义为approver = aliased(NedPersonT)
sqlalchemy.orm.Query.exists
半生不熟的例子
我在这里也使用别名,因为我不太了解将子查询包装在括号中的操作方法。如果没有它,它似乎可以工作,但是原始sql很难读取。这是我制作的一个玩具示例,用于尝试查看生成的SQL是否无效
该子选择不起作用,因此我将其改写为一个案例语句。现在它开始工作了。此外,我还必须在主查询中加入几个额外的表,以方便处理这个新情况
相关问题 更多 >
编程相关推荐