Sugiero volver a escribir la declaración para que solo haya un argumento de vinculación. Este enfoque es un poco feo, pero devuelve el conjunto de resultados:
select max(col1)
, f_col2
from (
select col1
, f(? ,col2) as f_col2
from t
)
group
by f_col2
Esta declaración re-escrito tiene una referencia a un solo argumento se unen, por lo que ahora el DBMS ve las expresiones en la cláusula GROUP BY y la La lista SELECT es idéntica.
HTH
[EDIT]
(Me gustaría que hubiera una manera más bonita, es por eso que prefiero el enfoque argumento de vinculación llamada que Oracle utiliza. Con el controlador Perl DBI, argumentos posicionales se convierten en argumentos con nombre en la declaración enviada a Oracle.)
No vi el problema al principio, no entendí la pregunta original. (Aparentemente, varias otras personas también lo echaron de menos.) Pero después de ejecutar algunos casos de prueba, me di cuenta cuál era el problema, cuál era la pregunta que estaba funcionando.
Déjeme ver si puedo establecer el problema: cómo obtener dos argumentos de enlace separados (posicionales) para ser tratados (por el DBMS) como si fueran dos referencias al mismo argumento de enlace (nombrado).
El DBMS espera que la expresión en el GROUP BY coincida con la expresión en la lista SELECT. Pero las dos expresiones se consideran DIFERENTES incluso cuando las expresiones son idénticas, cuando la única diferencia es que cada expresión hace referencia a una variable de vinculación diferente. (Podemos demostrar algunos casos de prueba que al menos algunos DBMS permitirán, pero hay casos más generales que generarán una excepción.)
En este punto, la respuesta corta es que eso me dejó perplejo. La sugerencia que tengo (que puede no ser una respuesta real a la pregunta original) es reestructurar la consulta.
[/ EDIT]
que puede proporcionar más detalles si este enfoque no funciona, o si tiene algún otro problema para comprender. O si hay un problema con el rendimiento (puedo ver que el optimizador elige un plan diferente para la consulta reescrita, aunque devuelve el conjunto de resultados especificado. Para realizar más pruebas, realmente necesitamos saber qué DBMS, qué controlador, estadísticas, etc.) Años
EDITAR (ocho y media más tarde)
Otro intento de una reescritura de la consulta. Una vez más, la única solución que se me ocurre es una consulta con un marcador de posición de enlace. Esta vez, lo pegamos en una vista en línea que arroja una sola fila y lo sumamos a t. Puedo ver lo que está haciendo; No estoy seguro de cómo el optimizador de Oracle verá esto. Es posible que deseemos (o necesitemos) hacer una conversión explícita, p. TO_NUMBER(?) AS param
, TO_DATE(?,'...') AS param
, TO_CHAR(?) AS param
, dependiendo del tipo de datos del parámetro de enlace, y el tipo de datos que queremos ser devueltos a partir de la vista.)
Esta es la forma en que lo haría en MySQL. La consulta original en mi respuesta hace la operación de unión dentro de la vista en línea (MySQL tabla derivada). Y queremos evitar materializar una tabla derivada de hughjass si podemos evitarla. Por otra parte, MySQL probablemente permita que la consulta original se desplace siempre que sql_mode
no incluya ONLY_FULL_GROUP_BY
. MySQL también nos dejaba soltar el FROM DUAL
)
SELECT MAX(t.col1)
, f(v.param ,t.col2)
FROM t
CROSS
JOIN (SELECT ? AS param FROM DUAL) v
GROUP
BY f(v.param ,t.col2)
De acuerdo con la respuesta de MadusankaD, dentro de los últimos ocho años, Oracle ha añadido para la reutilización de los mismos parámetros de vinculación llamada en el controlador JDBC, y la retención de equivalencia. (No he probado, pero si que funciona ahora, entonces genial.)
qué es exactamente lo que desea enlazar? Muéstranos tu código, no solo un fragmento. Puede enlazar un valor como 'YYYY' pero no un nombre de columna. – tuinstoel
ACTUALIZACIÓN: Ahora veo lo que está mal. El DBMS no reconoce que la expresión en el GROUP BY es la misma expresión en la lista SELECT. Es verlos como dos expresiones separadas. El uso de una variable de vinculación con nombre evita ese problema, ya que solo hay un valor. – spencer7593