But we're not looking for one row in the Certificate table, what it does is, for _every_ CSR, take the Certificate metadata that matches the _oldest_ certificate.
The equivalent using a Join would be the following (the below is the generated code): SELECT certificate.csr_id AS certificate_csr_id, certificate.not_before AS certificate_not_before, certificate.not_after AS certificate_not_after FROM certificate JOIN (SELECT certificate.csr_id AS csr_id, max(certificate.not_after) AS not_after FROM certificate GROUP BY certificate.csr_id) AS latest ON certificate.csr_id = latest.csr_id AND certificate.not_after = latest.not_after And while I'm pretty certain the above query isn't in any way the optimal one, I'm still a bit out of my depth on the SQL side of things. On Sun, Jul 26, 2015 at 8:33 PM, Mike Bayer <mike...@zzzcomputing.com> wrote: > > > On 7/26/15 12:56 PM, Dennis Ljungmark wrote: > > Hello, all. > > I am trying to reshape the (somewhat tricky) SQL query below into > something SQLAlchemy can generate, and I just hit a wall: > > This is the query: > SELECT (c).csr_id, (c).not_before, (c).not_after FROM (SELECT (SELECT c FROM > certificate c WHERE c.csr_id=csr.id ORDER BY c.not_after DESC LIMIT 1) AS c > FROM csr offset 0) s; > > And, I just can't seem to get SQLAlchemy to emit a correlated scalar > subquery like this. > > correlated scalar subqueries are illustrated in the Core tutorial at > http://docs.sqlalchemy.org/en/rel_1_0/core/tutorial.html#scalar-selects. > I'm not sure why inklesspen's example isn't making use of as_scalar() or > stmt.label(), which would be required. Query supports the same use if > you are working with ORM queries. > > However, the statement "SELECT c FROM certificate c" and the "(c).csr_id" > syntax appears to be using a very unusual postgresql-specific syntax which > is rolling the whole inner row into a single-column tuple and then > referencing it that way, which is odd because the row itself is already a > tuple, not sure what forcing it into a tuple that contains exactly one tuple > accomplishes here. > > While we can certainly use tuple_() and probably create some extra custom > constructs around it to support this syntax, I see nothing in this specific > statement to justify the use of these syntaxes, nor the need to produce > correlated scalar subqueries when we just are looking for one row from the > "certificate" table. I don't at the moment see why you can't use this > statement, which is easier to read, platform agnostic, and way more > efficient: > > SELECT c.csr_id, c.not_before, c.not_after FROM certificate AS c JOIN csr ON > csr.id = c.csr_id ORDER BY c.not_after DESC LIMIT 1 > > > > > > > > > > > There ought to be something, but for the life of me I can't seem to make it > happen. > > InklessPen tried to help me on IRC, and we got something, but it's still not > quite the same, > https://gist.github.com/inklesspen/49e69e1f33f3852d348a > > A reduced model is below, > > > class CSR(Base): > certificates = _orm.relationship("Certificate", backref="csr") > > class Certificate(Base): > not_before = _sa.Column(_sa.DateTime, nullable=False) > not_after = _sa.Column(_sa.DateTime, nullable=False) > csr_id = _fkcolumn(CSR.id, nullable=False) > > > Regards, > D.S. > > -- > You received this message because you are subscribed to the Google Groups > "sqlalchemy" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to sqlalchemy+unsubscr...@googlegroups.com. > To post to this group, send email to sqlalchemy@googlegroups.com. > Visit this group at http://groups.google.com/group/sqlalchemy. > For more options, visit https://groups.google.com/d/optout. > > > -- > You received this message because you are subscribed to a topic in the > Google Groups "sqlalchemy" group. > To unsubscribe from this topic, visit > https://groups.google.com/d/topic/sqlalchemy/ooNUhATaTEU/unsubscribe. > To unsubscribe from this group and all its topics, send an email to > sqlalchemy+unsubscr...@googlegroups.com. > To post to this group, send email to sqlalchemy@googlegroups.com. > Visit this group at http://groups.google.com/group/sqlalchemy. > For more options, visit https://groups.google.com/d/optout. -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To unsubscribe from this group and stop receiving emails from it, send an email to sqlalchemy+unsubscr...@googlegroups.com. To post to this group, send email to sqlalchemy@googlegroups.com. Visit this group at http://groups.google.com/group/sqlalchemy. For more options, visit https://groups.google.com/d/optout.