Обсуждение: "Subquery must return only one column" & query optimization
Hi, I was trying to run this query this morning: -------------------------- SELECT r.*, (SELECT rl.reminder_header,rl.reminder_footer FROM reminder_levels AS rlWHERE rl.lookup =( SELECT MAX(reminder_level_lookup) FROM reminders WHERE customer_id= r.customer_id) ) FROM reminders AS r -------------------------- Postgresql replied that: -------------------------- ERROR: subquery must return only one column SQL state: 42601 -------------------------- Is there a way to avoid writing: -------------------------- SELECT r.*, (SELECT rl.reminder_header FROM reminder_levels AS rlWHERE rl.lookup =( SELECT MAX(reminder_level_lookup) FROM reminders WHERE customer_id= r.customer_id) ) AS reminder_header, (SELECT rl.reminder_footer FROM reminder_levels AS rlWHERE rl.lookup =( SELECT MAX(reminder_level_lookup) FROM reminders WHERE customer_id= r.customer_id) ) AS reminder_footer FROM reminders AS r -------------------------- ... which works, but runs twice the same subselect block: --------------------------FROM reminder_levels AS rlWHERE rl.lookup =( SELECT MAX(reminder_level_lookup) FROM reminders WHERE customer_id = r.customer_id) -------------------------- Thanks, Philippe Lang
"Philippe Lang" <philippe.lang@attiksystem.ch> writes:
> I was trying to run this query this morning:
> --------------------------
> SELECT
> r.*,
> (
> SELECT
> rl.reminder_header,
> rl.reminder_footer
> FROM reminder_levels AS rl
> WHERE rl.lookup =
> (
> SELECT MAX(reminder_level_lookup)
> FROM reminders
> WHERE customer_id = r.customer_id
> )
> )
> FROM reminders AS r
> --------------------------
> Postgresql replied that:
> --------------------------
> ERROR: subquery must return only one column
Since 8.0 or so you could write the sub-select as
SELECT ROW(rl.reminder_header, rl.reminder_footer) FROM ...
We ought to make that happen automatically, but it's not real
high on the to-do list.
regards, tom lane
pgsql-sql-owner@postgresql.org wrote: > "Philippe Lang" <philippe.lang@attiksystem.ch> writes: >> I was trying to run this query this morning: > >> -------------------------- >> SELECT > >> r.*, > >> ( >> SELECT > >> rl.reminder_header, >> rl.reminder_footer > >> FROM reminder_levels AS rl >> WHERE rl.lookup = >> ( >> SELECT MAX(reminder_level_lookup) >> FROM reminders >> WHERE customer_id = r.customer_id >> ) >> ) > >> FROM reminders AS r >> -------------------------- > >> Postgresql replied that: > >> -------------------------- >> ERROR: subquery must return only one column > > Since 8.0 or so you could write the sub-select as > > SELECT ROW(rl.reminder_header, rl.reminder_footer) FROM ... > > We ought to make that happen automatically, but it's not real high on > the to-do list. Hi Tom, Fine, the query is faster now: ------------------------ SELECT r.*, (SELECT ROW(rl.reminder_header, rl.reminder_header) FROM reminder_levels AS rlWHERE rl.lookup =( SELECT MAX(reminder_level_lookup) FROM reminders WHERE customer_id= r.customer_id) ) AS rec FROM reminders AS r ------------------------ ... but the last column is now of type "record", and since this query serves as a datasource for a MS Access report, it is not able to "split" the record into the values that interest me: reminder_header and reminder_footer! Regards, Philippe Lang