Hello,
I had this query that ran perfectly on SqlServer, but Oracle doesn't like it:
RelationPredicateBucket filter = new RelationPredicateBucket();
filter.Relations.Add(MStatementEmissionCycleEntity.Relations.MStatementEmissionEntityUsingIdMAcquirerIdMProductGenerationDate);
filter.PredicateExpression.Add(PredicateFactory.CompareValue(MStatementEmissionCycleFieldIndex.IdMAcquirer, ComparisonOperator.Equal, idAcquirer));
filter.PredicateExpression.Add(PredicateFactory.CompareValue(MStatementEmissionCycleFieldIndex.IdMProduct, ComparisonOperator.Equal, idProduct));
ResultsetFields fields = new ResultsetFields(6);
fields.DefineField(MStatementEmissionCycleFieldIndex.IdMAcquirer, 0, "IdMAcquirer");
fields.DefineField(MStatementEmissionCycleFieldIndex.IdMProduct, 1, "IdMProduct");
fields.DefineField(MStatementEmissionCycleFieldIndex.Type, 2, "Type");
fields.DefineField(MStatementEmissionCycleFieldIndex.IdMCycle, 3, "IdMCycle");
fields.DefineField(MStatementEmissionFieldIndex.GenerationResult, 4, "GenerationResult", "MStatementEmission", AggregateFunction.Max);
fields.DefineField(MStatementEmissionCycleFieldIndex.GenerationDate, 5, "GenerationDate", "MStatementEmissionCycle", AggregateFunction.Max);
ISortExpression sorter = new SortExpression();
sorter.Add(SortClauseFactory.Create(MStatementEmissionCycleFieldIndex.GenerationDate, SortOperator.Descending));
IGroupByCollection groupBy = new GroupByCollection();
groupBy.Add(fields[0]);
groupBy.Add(fields[1]);
groupBy.Add(fields[2]);
groupBy.Add(fields[3]);
DataTable dynamicList = new DataTable();
adapter.FetchTypedList(fields, dynamicList, filter, 0, sorter, true, groupBy);
I checked the query using the marvelous trace listeners, it goes like this:
Query:
SELECT
"MStatementEmissionCycle"."IdMAcquirer" AS "IdMAcquirer",
"MStatementEmissionCycle"."IdMProduct" AS "IdMProduct",
"MStatementEmissionCycle"."Type" AS "Type",
"MStatementEmissionCycle"."IdMCycle" AS "IdMCycle",
MAX("MStatementEmission"."GenerationResult") AS "GenerationResult",
MAX("MStatementEmissionCycle"."GenerationDate") AS "GenerationDate"
FROM "MStatementEmission", "MStatementEmissionCycle"
WHERE
"MStatementEmission"."IdMAcquirer"="MStatementEmissionCycle"."IdMAcquirer" AND
"MStatementEmission"."IdMProduct"="MStatementEmissionCycle"."IdMProduct" AND
"MStatementEmission"."GenerationDate"="MStatementEmissionCycle"."GenerationDate" AND
( "MStatementEmissionCycle"."IdMAcquirer" = :IdMAcquirer1 And "MStatementEmissionCycle"."IdMProduct" = :IdMProduct2)
GROUP BY
"MStatementEmissionCycle"."IdMAcquirer",
"MStatementEmissionCycle"."IdMProduct",
"MStatementEmissionCycle"."Type",
"MStatementEmissionCycle"."IdMCycle"
ORDER BY "MStatementEmissionCycle"."GenerationDate" DESC
Parameter: :IdMAcquirer1 : Int16. Length: 0. Precision: 4. Scale: 0. Direction: Input. Value: 1.
Parameter: :IdMProduct2 : Int16. Length: 0. Precision: 4. Scale: 0. Direction: Input. Value: 1.
At first sight it looks fine, but take a closer look at the ORDER BY clause. It says
ORDER BY "MStatementEmissionCycle"."GenerationDate" DESC
, but it should say
ORDER BY MAX("MStatementEmissionCycle"."GenerationDate") AS "GenerationDate"
Any thoughts on how to get it right?
Thanks for your time!
álvaro.-
p.s.: some context, Oracle is 9i accessed using ODP.NET 9.2.0.7, LLBLGenPro version is 2004.2.final.