Re: sql question

From: <jfr_at_glitter.RedBrick.COM>
Date: Sat, 19 Sep 1992 02:57:19 GMT
Message-ID: <1992Sep19.025719.26186_at_RedBrick.COM>


In article <1992Sep17.182003.15396_at_informix.com> cortesi_at_informix.com writes:
>In article <9539_at_emory.mathcs.emory.edu> baskett_at_hermes1.sps.mot.com (Bob
>Baskett) writes:
>> my first select looks like:
>> select a.source_lot, count(DISTINCT b.source_lot)
>> from system:trace a, system:trace b
>> where a.trace_type = "ASM"
>> and b.trace_type = "WAF"
>> and b.test_lot = a.test_lot
>> and b.test_lot_class = a.test_lot_class
>> group by a.source_lot
>> having count(DISTINCT b.source_lot) > 1
>>
>> which yeilds a syntax error on the 'having count(DISTINCT...'.
>
>This question created a lot of discussion around here. The
>authoritative reply is that you cannot use DISTINCT twice
>in a single SELECT. That's an ANSI SQL rule, and the basis
>of the syntax error. Looks like you'll have to use a temp
>table. Alternatively of course you could use esql or 4GL
>and apply the logical equivalent of HAVING in procedural code.
>Or possibly you could achieve this effect in an AFTER GROUP
>clause of an ACE or (more likely) 4GL report.

  The apparent problem here in ANSI is the overloading of the   use of the word DISTINCT in both query/subquery definitions   and in aggregate functions. There is really no particular   conflict to using DISTINCT multiple times in aggregate   functions. Since each <distinct set function> has as its   argument a different set of values for each grouped row,   it is completely possible (albeit a bit costly in terms of   processing) to eliminate redundant values in each list.   There is clearly a problem using DISTINCT in a query/subquery   specification multiple times.

  More importantly, when DISTINCT is used in a HAVING solely   for the purpose of referencing a column which has already   been created for inclusion in the SELECT list and it is   the only column that has DISTINCT in it, there is simply   no justification for complying with this ANSI restriction   (except solely to be dogmatic about ANSI). The columns   are the same and should be treated that way by the DBMS.   This would be about as silly as saying you can't use the   AVG function on the same column in both the SELECT list   and the HAVING clause which would pretty much doom the   usefulness of the HAVING clause.

  Personally, I think this is a glitch by the ANSI committee   for the 89 spec (SQL2 clearly does not have this limitation   as far as I can tell with the generalization of subqueries).   Anyone out there on the ANSI committee willing to try and   justify why this restriction is in there?

  Jon Rosen Received on Sat Sep 19 1992 - 04:57:19 CEST

Original text of this message