1

すべてが順調であることを願っています。まず、私の SQL が良くなくて申し訳ありません。

次のような生のSQLがあります

select a.appointmentId, a.patientId, r.MaxTime from (
    select appointmentid, patientid, max(apptDate) as MaxTime
        from appointment 
        where facilityid=95
        group by patientid
    ) r
inner join

Appointment a on 
a.patientid = r.patientid and 
a.apptDate = r.MaxTime

コードで SQLAlchemy の宣言型スタイルを使用しています。これがクエリの外観です

appt_query = alchemy_session.query(Appointment.appointmentId, Appointment.patientId,          func.max(Appointment.apptDate).label('maxTime')).filter(

        Appointment.facilityId == 95,

).group_by(Appointment.patientId).subquery()


 appointments  = alchemy_session.query(Appointment.appointmentId, Appointment.patientId,    appt_query.c.maxTime).outerjoin(

            appt_query, and_(
                Appointment.patientId == appt_query.c.patientId,
                Appointment.apptDate == appt_query.c.maxTime
            )

)

しかし、私がするとき

予定を印刷する

残念ながら、私が望むSQLを生成していません。SQL の理解に誤りがあることはわかっているので、これに関する指針は本当に役に立ちます。お時間をいただき、ありがとうございました。

4

1 に答える 1

0

sayapが述べているように、これは同じクエリに非常に近いものです。.outerjoin()toを修正した後、残っているのは、サブクエリが相関しないように、エイリアス.join()のインスタンスを1つ指定することだけです。Appointmentそれはうまくやったsqlalchemy.orm.aliased

>>> from sqlalchemy.orm import aliased, Query
>>> appt_alias = aliased(Appointment)
>>> appt_query = Query([Appointment.appointmentId,
...                     Appointment.patientId,
...                     func.max(Appointment.apptDate).label('maxTime')]) \
...             .filter(Appointment.facilityId == 95,) \
...             .group_by(Appointment.patientId) \
...             .subquery()
>>> appointments  = Query([appt_alias.appointmentId,
...                        appt_alias.patientId,
...                        appt_query.c.maxTime]) \
...                 .join(appt_query, and_(
...                     appt_alias.patientId == appt_query.c.patientId,
...                     appt_alias.apptDate == appt_query.c.maxTime) )
>>> 
>>> print appointments
SELECT appointment_1."appointmentId" AS "appointment_1_appointmentId", appointment_1."patientId" AS "appointment_1_patientId", anon_1."maxTime" AS "anon_1_maxTime" 
FROM appointment AS appointment_1 JOIN (SELECT appointment."appointmentId" AS "appointmentId", appointment."patientId" AS "patientId", max(appointment."apptDate") AS "maxTime" 
FROM appointment 
WHERE appointment."facilityId" = :facilityId_1 GROUP BY appointment."patientId") AS anon_1 ON appointment_1."patientId" = anon_1."patientId" AND appointment_1."apptDate" = anon_1."maxTime"
于 2012-04-15T04:45:14.060 に答える