From: | "Ben Tilly" <btilly(at)gmail(dot)com> |
---|---|
To: | pgsql-hackers(at)postgresql(dot)org |
Subject: | SQL feature requests |
Date: | 2007-08-22 23:45:31 |
Message-ID: | acc274b30708221645p6bf5bc5etfa346306e8e5a448@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
Hopefully this is the right place for a few feature requests that
would address some of the things that I've noticed in postgres.
1. Just a minor annoyance, but why must subqueries in FROM clauses
have an alias? For instance suppose that I have an orders table, and
one of the fields is userid. The following is unambiguous and is
legal in Oracle:
SELECT order_count
, count(*) as people
FROM (
SELECT count(*) as order_count
FROM orders
GROUP BY userid
)
GROUP BY order_count
It annoys me that it isn't legal in postgres. (Yes, I know how to fix
the query. But it still is an annoyance, and it comes up fairly often
in reporting purposes.)
2. Why is 'non-integer constant in GROUP BY' an error?
I find it inconvenient. For reporting purposes I often have to
dynamically build queries in code. An easy way to do that is just
interpolate in a set of possible statements which will either be empty
strings or have trailing commas. But then I need this (possibly
empty) list to have a valid group by statement at the end. In Oracle
I used to just write it like this:
SELECT ...
GROUP BY $possible_term_1
$possible_term_2
$possible_term_3
'end of possible groupings'
In postgres I either have to use a different strategy to build up
these strings, or else use a more complicated term to finish that off.
This works for now:
case when true then true end
but I don't know whether some future version of postgres might break
my code by banning that as well.
3. How hard would it be to have postgres ignore aliases in group by
clauses? Per my comments above, I often build complex queries in
code. I can't easily use the shortcut of referring to the select
column by number because the position is hard to determine. So my
code has to copy the select terms. But I can't copy them exactly
because the select terms include lots of "...as foo" clauses that are
not allowed in a group by. So I have to store very similar terms to
use twice.
It would be nice if I could just make the group by look like the
select, and have the (obviously irrelevant) aliases just be ignored.
4) Items 2 and 3 would both be made irrelevant if postgres did
something that I'd really, really would like. Which is to assume that
a query without a group by clause, but with an aggregate function in
the select, should have an implicit group by clause where you group by
all non-aggregate functions in the select.
For example
SELECT foo, count(*)
FROM bar
would be processed as:
SELECT foo, count(*)
FROM bar
GROUP BY foo
If I write a query with an aggregate function in the select, better
than 95% of the time this is the group by clause that I want. (This
email has one of the few exceptions.) In the remaining cases I could
easily add the extra stuff in the group by to the select without
problems. Therefore if postgres could just insert the obvious group
by clause in, I would never again write the words "group by" when
working with postgres. And I predict that many other people would do
the same.
But it doesn't. So when working with postgres, just like every other
database that I've used, I have to constantly type in group by clauses
with entirely redundant information. (But they're not EXACTLY the
same as the select clauses that they are redundant with...)
Cheers,
Ben
From | Date | Subject | |
---|---|---|---|
Next Message | Peter Eisentraut | 2007-08-22 23:49:46 | Re: [COMMITTERS] pgsql: Add configure option --with-system-tzdata to use operating system |
Previous Message | Gregory Stark | 2007-08-22 23:36:19 | Re: [COMMITTERS] pgsql: Add configure option --with-system-tzdata to use operating system |