|
No, the optimizer doesn't rewrite the Union as a Join. The results are not the same between the two operations. The reason it works this way is that the full-select statement, which contains the UNION, is used as a common table expression. An equivalent statement is: c/exec sql c+ with table1 as c+ ( Select fdvdcd as vendor, c+ vdvnam as vdname, c+ rfslip as slip c+ From rflog, fldmst, isfile, vdmast c+ Where (rfuser = :k1user) and c+ (rftype = :type) and c+ date(rftrdt) = date(:k1date) and c+ isslip = rfslip and c+ fdflno = isflno and c+ fdlnno = isflln and c+ vdvdcd = fdvdcd c+ Union c+ Select fdvdcd as vendor, c+ vdvnam as vdname, c+ rfslip as slip c+ From rflog, fldmst, bofile, vdmast c+ Where (rfuser = :k1user) and c+ (rftype = :type) and c+ rftype <> 'BI' and c+ date(rftrdt) = date(:k1date) and c+ boslip = rfslip and c+ fdflno = boflno and c+ fdlnno = boflln and c+ vdvdcd = fdvdcd c+ ) c+ Declare CR1 cursor for c+ Select vendor, c+ vdname, c+ count(slip) c+ From table1 c+ Group by vendor, c+ vdname c+ Order by vendor, c+ vdname This alternate syntax makes it easy to see that a temporary table is being built that can be used in the later select statement(s). Note: I don't use CTE in embedded in SQL. So, the location of the declare might not be correct. It may need to go at the top, but I don't think so. Also, if the CTE above is used often, but not often enough to create a view. Consider putting it into a UDF table function. That would allow the following: c+ Declare CR1 cursor for c+ Select vendor, c+ vdname, c+ count(slip) c+ From table(myUDFtable) c+ Group by vendor, c+ vdname c+ Order by vendor, c+ vdname HTH, Charles Wilt iSeries Systems Administrator / Developer Mitsubishi Electric Automotive America ph: 513-573-4343 fax: 513-398-1121 > -----Original Message----- > From: R Bruce Hoffman [mailto:bruce.hoffman@xxxxxxxxxxxxxxxxx] > Sent: Friday, December 03, 2004 7:51 AM > To: RPG programming on the AS400 / iSeries > Subject: Re: Strange SQL error > > > That's a FROM clause, not a WHERE clause. The optimizer (IIRC) will > rewrite the union as a join and then provide the result to the select. > > > On Fri, 2004-12-03 at 07:43, Peter.Colpaert@xxxxxxxxxx wrote: > > What I don't understand, is that the following statement does work: > > > > c/exec sql > > c+ Declare CR1 cursor for > > c+ Select vendor, > > c+ vdname, > > c+ count(slip) > > c+ From ( > > c+ Select fdvdcd as vendor, > > c+ vdvnam as vdname, > > c+ rfslip as slip > > c+ From rflog, fldmst, isfile, vdmast > > c+ Where (rfuser = :k1user) and > > c+ (rftype = :type) and > > c+ date(rftrdt) = date(:k1date) and > > c+ isslip = rfslip and > > c+ fdflno = isflno and > > c+ fdlnno = isflln and > > c+ vdvdcd = fdvdcd > > c+ Union > > c+ Select fdvdcd as vendor, > > c+ vdvnam as vdname, > > c+ rfslip as slip > > c+ From rflog, fldmst, bofile, vdmast > > c+ Where (rfuser = :k1user) and > > c+ (rftype = :type) and > > c+ rftype <> 'BI' and > > c+ date(rftrdt) = date(:k1date) and > > c+ boslip = rfslip and > > c+ fdflno = boflno and > > c+ fdlnno = boflln and > > c+ vdvdcd = fdvdcd > > c+ ) as table1 > > c+ Group by vendor, > > c+ vdname > > c+ Order by vendor, > > c+ vdname > > c/end-exec > > > > > > The difference might be that I'm now at a new client on > V5R1M0, and the > > above was made on V5R3M0... > > > > Or is this something completely different? > > > > Thanks, > > > > Peter Colpaert > > Application Developer > > Massive - Kontich, Belgium > > ----- > > Real developers never document. If it was hard to write, > it should be > > hard to understand. > > ----- > > > > > > > > > > > > R Bruce Hoffman <bruce.hoffman@xxxxxxxxxxxxxxxxx> > > Sent by: rpg400-l-bounces@xxxxxxxxxxxx > > 03/12/2004 13:36 > > Please respond to RPG programming on the AS400 / iSeries > > > > > > To: RPG programming on the AS400 / iSeries > <rpg400-l@xxxxxxxxxxxx> > > cc: > > Subject: Re: Strange SQL error > > > > > > Well, if I'm not mistaken, selects in a where clause must be > > sub-selects. By definition, any select with a union operator is a > > full-select. > > Part of the language definition. > > > > > > > > > > -- > > This is the RPG programming on the AS400 / iSeries > (RPG400-L) mailing list > > To post a message email: RPG400-L@xxxxxxxxxxxx > > To subscribe, unsubscribe, or change list options, > > visit: http://lists.midrange.com/mailman/listinfo/rpg400-l > > or email: RPG400-L-request@xxxxxxxxxxxx > > Before posting, please take a moment to review the archives > > at http://archive.midrange.com/rpg400-l. > -- > "Bigamy is having one wife too many. Monogamy is the same." > -- Oscar Wilde > > -- > This is the RPG programming on the AS400 / iSeries (RPG400-L) > mailing list > To post a message email: RPG400-L@xxxxxxxxxxxx > To subscribe, unsubscribe, or change list options, > visit: http://lists.midrange.com/mailman/listinfo/rpg400-l > or email: RPG400-L-request@xxxxxxxxxxxx > Before posting, please take a moment to review the archives > at http://archive.midrange.com/rpg400-l. >
As an Amazon Associate we earn from qualifying purchases.
This mailing list archive is Copyright 1997-2024 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].
Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.