Anmelden

View Full Version : select distinct und order by - V5R2Mo abbruch



holly
10-12-07, 10:50
Hallo all,
ich bekomme in einer ADO.NET-Anwendung folgenden SQL abbruch:
auf der Iseries läuft V5R2M0
Failed to execute database command: 'SELECT DISTINCT T0."SALE_ID", T0."SALEDATE", T0."PROBABILITY", T0."STATUS", T0."HEADING", T0."AMOUNT", T3."NAME", T1."NAME", T4."NAME", T0."PERSON_ID", T5."FIRSTNAME", T5."MIDDLENAME", T5."LASTNAME", VARCHAR(T2."TEXT", 2048), T0."PROJECT_ID", T0."CONTACT_ID", T0."EARNING", T0."EARNING_PERCENT", T0."ASSOCIATE_ID", T0."GROUP_IDX", T0."VISIBILITY", T0."DONE", T0."REGISTERED", T0."REGISTERED_ASSOCIATE_ID", T3."CONTACT_ID", T3."ASSOCIATE_ID", T3."BUSINESS_IDX", T3."GROUP_ID", T3."REGISTERED", T3."REGISTERED_ASSOCIATE_ID", T3."XSTOP", T4."PROJECT_ID", T4."ASSOCIATE_ID", T4."GROUP_ID", T4."REGISTERED", T4."REGISTERED_ASSOCIATE_ID", T5."PERSON_ID", T5."ASSOCIATE_ID", T5."GROUP_ID", T5."REGISTERED", T5."REGISTERED_ASSOCIATE_ID", T5."RETIRED", T7."CONTACT_ID", T7."ASSOCIATE_ID", T7."BUSINESS_IDX", T7."GROUP_ID", T7."REGISTERED", T7."REGISTERED_ASSOCIATE_ID", T7."XSTOP" FROM CRM5."SALE" T0 LEFT OUTER JOIN CRM5."CURRENCY" T1 ON (T0."CURRENCY_ID" = T1."CURRENCY_ID") LEFT OUTER JOIN CRM5."TEXT" T2 ON (T0."TEXT_ID" = T2."TEXT_ID") LEFT OUTER JOIN CRM5."CONTACT" T3 ON (T0."CONTACT_ID" = T3."CONTACT_ID") LEFT OUTER JOIN CRM5."PROJECT" T4 ON (T0."PROJECT_ID" = T4."PROJECT_ID") LEFT OUTER JOIN CRM5."PERSON" T5 ON (T0."PERSON_ID" = T5."PERSON_ID") INNER JOIN CRM5."VISIBLEFOR" T6 ON (T0."SALE_ID" = T6."RECORDID" AND (T6."TABLEID" = @P0) AND(((((T6."FORALL" = @P1) OR(T6."FORASSOCID" = @P2))) OR(T6."FORGROUPID" IN(@P3, @P4))))) LEFT OUTER JOIN CRM5."CONTACT" T7 ON (T5."CONTACT_ID" = T7."CONTACT_ID") WHERE T0."SALE_ID" = @P5 ORDER BY UPPER(T0."HEADING") ASC'
On Database: 'IBM.Data.DB2.iSeries.iDB2Connection'

Der Abbruch ist berechtigt weil im Select das T0.heading ohne UPPER steht.
Jetzt meine Frage :

Ist dies in Versin V5R3M0 eine gültige Anweisung (muss ich einen Releasewechsel machen???) !

Gruss Holger

B.Hauser
10-12-07, 12:02
Hallo Holger,

Wenn Distinct und Order By in einem Select-Statement verwendet werden, müssen die Order By-Spalten mit den im Select angegebenen Spalten übereinstimmen.

Das ist auch unter Release V5R4 so.

Das einzige, was Du machen kannst, ist eine zusätzliche Spalte beim Select mit Upper(Feld) angeben oder die Sortierreihenfolge von HEX auf LangIdShr oder LangIdUnq ändern.

Birgitta

Fuerchau
10-12-07, 13:24
Die OrderBy-Klausel darf nur Feldnamen, die in diesem Fall im Select enthalten sein müssen, aufführen.
SQL-Funktionen wie UPPER sind hier nicht erlaubt:

select UPPER(T0."HEADING"), ...
ORDER BY T0."HEADING" ASC'

holly
10-12-07, 13:45
Hallo Baldur,
ich stimme da nur Birgitta zu:
SELECT distinct location, UPPER(LOCATION)
FROM appointment WHERE PROJECT_ID >
9290 ORDER BY UPPER(LOCATION)
SELECT-Anweisung vollständig verarbeitet.

funzt auch unter V5R2M0.
Gruss Holger

Aber intersessant zu wissen, dass das so unter 5.4 auch nicht geht - das war ja meine eigentliche Frage.
Weiß jemand evtl. ob das unter SQL-Server von Kleinweich oder oracle funktioniert wenn in Order By was anderes steht als in select?
Danke

BenderD
10-12-07, 14:14
Hallo,

nach SQL Standard ist order by eine Funktion des Result Sets und was man da nicht drin hat, danach kann man gemäß elementarer Logik nicht sortieren. Ohne das distinct könnte man das upper(ebbes) mit aufnehmen und dann ignorieren, mit dem distinct kann man da nochwas über einen join zusammen basteln, oder die Sortierfolge austricksen, wenn die Fußnägel das noch mitmachen ohne sich aufzurollen.

mfg

Dieter Bender


Hallo Baldur,
ich stimme da nur Birgitta zu:
SELECT distinct location, UPPER(LOCATION)
FROM appointment WHERE PROJECT_ID >
9290 ORDER BY UPPER(LOCATION)
SELECT-Anweisung vollständig verarbeitet.

funzt auch unter V5R2M0.
Gruss Holger

Aber intersessant zu wissen, dass das so unter 5.4 auch nicht geht - das war ja meine eigentliche Frage.
Weiß jemand evtl. ob das unter SQL-Server von Kleinweich oder oracle funktioniert wenn in Order By was anderes steht als in select?
Danke