[Info-Ingres] Few questions concerning Ingres 2006

Marek.Patrzek at gmail.com Marek.Patrzek at gmail.com
Mon Apr 16 18:01:08 CDT 2007


On 10 Kwi, 21:38, c... at usenet.invalid wrote:
> On Tue, 10 Apr 2007 08:21:08 +0100, "Roy Hann"
>
>
>
> <specia... at processed.almost.meat> wrote:
> ><Marek.Patr... at gmail.com> wrote in message
> >news:1176160545.998886.96220 at p77g2000hsh.googlegroups.com...
> >> On 9 Kwi, 21:23, "Roy Hann" <specia... at processed.almost.meat> wrote:
> >>> <Marek.Patr... at gmail.com> wrote in message
>
> >>>news:1176138756.104459.54830 at w1g2000hsg.googlegroups.com...
>
> >>> >> Subqueries in the FROM clause are supported as of Ingres 2006 Release
> >>> >> 2,
> >>> >> and
> >>> >> they require the use of the correlation name in the target list.  Try:
>
> >>> >> SELECT tmp.* FROM...
>
> >>> >> Roy
>
> >>> > Thanks for your replay, I will try that on tuesday.
>
> >>> > However, as I read that in the official sql reference, is using
> >>> > aggregate functions in the subquery forbidden ?
>
> >>> No, definitely not.  Apart from the HAVING clause, a subquery is the most
> >>> obvious place to expect to be abke to use an aggregate.  Do you have a
> >>> specific query in mind?
>
> >>> Roy
>
> >> Well I do, however it's hard to put you in the picture without having
> >> exact schema. I try to explain giving similar example.
>
> >> Let's assume, that we have table that holds info concerning
> >> correspondence (like ID, signature, author etc.), a table that holds
> >> attachments to correspondences (ID, correspondence_id, size etc).
>
> >> I want to know how show all data for a specific correspondence and
> >> size of its attachments. The simplest way, to that is by doing:
>
> >> SELECT
> >> correspondence.*,
> >> ata_cnt.cnt
> >> FROM
> >> correspondence
> >> JOIN
> >> (
> >> SELECT
> >> correspondence_id,
> >> SUM (size) AS cnt
> >> FROM
> >> attachment
> >> GROUP BY
> >> correspondence_id
> >> ) ata_cnt ON correspondence.id = ata_cnt.correspondence_id
>
> >That is exactly correct.  Here's what happens when I run an indentically
> >formed query on a toy database that I happen to have handy (this should be
> >displayed using a fixed pitch font):
>
> >INGRES TERMINAL MONITOR Copyright 2007 Ingres Corporation
> >Ingres 2006 Release 2 Microsoft Windows Version II 9.1.0 (int.w32/119) login
> >Tue Apr 10 08:00:11 2007
> >...
>
> >* \p
> >select p.*,x.total
> >from parts p
> >join
> >(  select partnr,sum(qty_on_hand) as total
> >   from parts_onhand
> >   group by partnr) x
> >on p.partnr = x.partnr
> >continue
> >* \g
> >Executing . . .
>
> >+-------+----------------+-----------+------+------+-------+
> >|partnr |description     |unit_cost  |produc|catego|total  |
> >+-------+----------------+-----------+------+------+-------+
> >|     10|Widget          |    124.500|WIDGET|FG    |     23|
> >|     15|EuroWidget      |    138.270|WIDGET|FG    |     27|
> >|     27|SuperWidget     |           |WIDGET|FG    |      0|
> >|     52|Gadget          |    376.000|GADGET|FG    |      2|
> >...
> >|  27027|Fastener        |      0.025|ALL   |RAWMAT|    855|
> >|  27298|Glue            |      0.350|ALL   |RAWMAT|     50|
> >|  27312|Zirconium Sheet |     99.950|GADGET|RAWMAT|      5|
> >+-------+----------------+-----------+------+------+-------+
> >(15 rows)
> >continue
> >*
>
> >> Please, do not focus @ this query's efficiency, as it's not this
> >> issue's clue :)
>
> >I never get hung up on the "efficiency" of a query.  In *principle* there is
> >no such thing as an efficient query, only a correct specification of the
> >required result, or an incorrect one.  Ingres is actually very good at
> >realizing that principle.  It is quite rare that Ingres produces a bad query
> >plan because of the way the SQL was written.  If it produces a bad plan
> >there are usually other reasons and therefore other ways of fixing the
> >problem.  If you approach Ingres thinking *you* have to solve the efficiency
> >problem you will end up wasting a lot of time.  With Ingres you worry about
> >how the SQL was written when all else fails.  (Which is not to say that you
> >have a license to write crap SQL.  My point is that if there is a clear way
> >to write what you want, and a less clear way that you fondly imagine is more
> >efficient, you will very often be wrong and you will have achieved nothing
> >except you will have made your code harder to read.)
>
> >> All I can say, is that, this particular way of
> >> retrieving data is the way it has to be done, as my real life case,
> >> which is far more complicated, force it.
>
> >Roy
>
> Gentlemen,
>
> Let us step back and look at what is trying to be achieved here:
>
> Roy, Unless I am missing something, do you not get the same results
> from:
>         select p.*, total=IFNULL(SUM(po.qty_on_hand), 0)
>         from parts p LEFT JOIN parts_onhand po ON p.partnr = po.partnr
>         group by p.partnr, p.col2, p.col3
> \g
>
> and Marek could try:
>
>         SELECT corr.*, cnt=SUM(att.size)
>         FROM    correspondence corr
>         LEFT JOIN attachment att
>                 ON corr.correspondence.id = att.correspondence_id
>         GROUP BY corr.correspondence.id, corr.col2, corr.col3, ....;
>
> All with nothing more complicated than an outer join (so I do not even
> have to think about whether the 'table' created by the subquery is
> fully instantiated before it is used or whether the query optimizer
> turns it into joins).
>
> Chris Dawe
> --
> Ingres Consultant
> ced... at bcs.org.uk

First of all - thanks for all replays.

Chris, everything you said is nothing new to me, however ! I just have
to use notation that I presented in my previous post - nested/sub
query that is. And Roy, I have no idea, how did you manage to do that,
as I always end up with "Table "select" does not exists or is not
owned by you"... at first, I thought that I can put all the blame on
JDBC, but than, I executed my query in a "native" way, using official
ingres 2006 RDBMS Release 2 and got same results.

Well than - what can possibly be wrong with my version of ingres, that
it DOES NOT support subqueries ?

A new issue - a bit off topic. I made a view which had casting
function (from varchar to integer) in the select statement. Everything
was fine, until I wanted to join my view with another table using
table.column which was an integer to some view.column which - in
theory was an integer too. Again - all I got was an error msg saying
that I got incompatible data types... I can assure you, that all the
data in my view was easily casted to integer. The thing is, I than
created the view WITHOUT casting and than in my join clause I added
casting function and everything was fine.

To sum up - it seems that Ingres omits somehow cast functions and
execute the select without them, so the question is - why ? Imho,
values AFTER the cast functions should be returned, or am I wrong ?



More information about the Info-Ingres mailing list