Re: Odd error in complex query (7.2): Sub-SELECT
От | Masaru Sugawara |
---|---|
Тема | Re: Odd error in complex query (7.2): Sub-SELECT |
Дата | |
Msg-id | 20011030233825.4028.RK73@echna.ne.jp обсуждение исходный текст |
Ответ на | Re: Odd error in complex query (7.2): Sub-SELECT (Philip Warner <pjw@rhyme.com.au>) |
Список | pgsql-hackers |
On Tue, 30 Oct 2001 11:49:28 +1100 Philip Warner wrote: > > It's not clear to me that it should be illegal - for every row in s1, it > should return the result of the column-select (which may be NULL) - or is > that what 'not flattening the query' does? > > >We > >already do that for certain conditions; we just have to figure out what > >additional restriction should be used to preclude this case. The > >restriction should be as tight as possible to avoid losing the ability > >to optimize queries using views. > > How about whenenever it will throw this error? ;-)., > > >A simplistic idea is to not pull up views that contain subselects in > >the targetlist, but I have a feeling that's not the right restriction. > > That does seem excessive. I'm way over my head here, but can a column > select be implemented as a special JOIN that always returns 1 row (maybe > NULL), and throws an error if more than one row? > Hi, I wouldn't think most people need a query like this, but also had been in puzzle as to how not to pull up. Finally the problem could be solved by using a statement of an ORDER BY. Therefore, if you add an ORDER BY to a view of your complex query, it will work correctly. And, as long as each of correlative subselects which are in columns always returns one row, I feel it is legal rather than illegal that its subselects can be GROUPed. -- on 7.1.2 create table t1(n text, f1 int, f2 int); create table g1(n text, t1n text); create table s1(k1 text, f1a int, f1b int, f2 int, x int, d timestamp); create view v1 as select k1, d, (select g1.n from g1, t1 where g1.t1n=t1.n and t1.f1 = s1.f1a and t1.f2 = s1.f2 limit 1) as a, (select g1.n from g1, t1 where g1.t1n=t1.n and t1.f1 = s1.f1b and t1.f2 = s1.f2 limit 1) as b, x from s1 order by 1 -- *** an additional statement *** ; explain select coalesce(a, b, 'other') as name, k1, sum(x) as tot from v1 where d > '28-oct-2001 12:00' and d < current_timestamp group by 1,2 order by tot desc limit 40; Regards, Masaru Sugawara
В списке pgsql-hackers по дате отправления: