viernes, mayo 26, 2006

SQL

Super-freak moment.
No he podido contenerme. Mi compañero estaba modificando esta consulta
y no he podido resistirme. Supongo que habrá consultas q hagan q esta a
su lado sea ridícula pero yo no habia visto cosa tan monstruosa nunca.

SELECT
'ESTADO' AS APORT,PO.FK_COD_PLAN AS PLANN,PO.FK_ANIO_COMIENZO AS ANNO,PO.EJERCICIO,PO.CI_ESTADO AS AGRUP,PO.FK_EXPEDIENTE AS EXP,
PO.FK_SUBOBRA AS SUB,
PO.CI_ESTADO AS EST,PO.CI_EUROPA AS EUR,PO.CI_AYTOS AS AYTO,
PO.CI_JUNTA AS JUNTA,PO.CI_OTRAS AS OTRAS,
P.DENOMINACION AS DENPLAN,OG.DENOMINACION AS DENOBRA,OG.FK_COD_MUNICIPIO,M.DENOMINACION AS DENMUNI,
NVL(SUM(EI.IMP_MAP),0) AS SUMA
FROM "ADMINOBRAS".PARTIDAS_OBRAS PO,"ADMINOBRAS".OBRAS_GENERAL OG,"ADMINOBRAS".PLANES P,
"ADMINOBRAS".MUNICIPIOS_PEDANIAS M,"ADMINOBRAS".EVOLUCION_INGRESOS EI
WHERE
(PO.CI_ESTADO IS NOT NULL) AND
(P.COD_PLAN=PO.FK_COD_PLAN) AND
(OG.ANIO_COMIENZO(+)=PO.FK_ANIO_COMIENZO) AND
(OG.FK_COD_PLAN(+)=PO.FK_COD_PLAN) AND
(OG.EXPEDIENTE(+)=PO.FK_EXPEDIENTE) AND
(OG.SUBOBRA(+)=PO.FK_SUBOBRA) AND
(M.COD_MUNICIPIO(+)=OG.FK_COD_MUNICIPIO) AND
(M.COD_PEDANIA(+)=OG.FK_COD_PEDANIA) AND
(EI.FK_ANIO_COMIENZO(+)=PO.FK_ANIO_COMIENZO) AND
(EI.FK_COD_PLAN(+)=PO.FK_COD_PLAN) AND
(EI.FK_EXPEDIENTE(+)=PO.FK_EXPEDIENTE) AND
(EI.FK_SUBOBRA(+)=PO.FK_SUBOBRA) AND
(TO_NUMBER(TO_CHAR(EI.F_ING_MAP,'YY'))=TO_NUMBER(TO_CHAR(PO.EJERCICIO,'00')))
:PARAMS
GROUP BY
PO.FK_COD_PLAN,PO.FK_ANIO_COMIENZO,PO.EJERCICIO,PO.CI_ESTADO,
PO.FK_EXPEDIENTE,
PO.FK_SUBOBRA,PO.CI_EUROPA,PO.CI_AYTOS,PO.CI_JUNTA,PO.CI_OTRAS,
P.DENOMINACION,OG.DENOMINACION,OG.FK_COD_MUNICIPIO,M.DENOMINACION
UNION ALL
SELECT
'EUROPA' AS APORT,PO.FK_COD_PLAN AS PLANN,PO.FK_ANIO_COMIENZO AS ANNO,PO.EJERCICIO,PO.CI_EUROPA AS AGRUP,PO.FK_EXPEDIENTE AS EXP,
PO.FK_SUBOBRA AS SUB,
PO.CI_ESTADO AS EST,PO.CI_EUROPA AS EUR,PO.CI_AYTOS AS AYTO,PO.CI_JUNTA AS JUNTA,PO.CI_OTRAS AS OTRAS,
P.DENOMINACION AS DENPLAN,OG.DENOMINACION AS DENOBRA,OG.FK_COD_MUNICIPIO,M.DENOMINACION AS DENMUNI,
NVL(SUM(EI.IMP_ADMF),0) AS SUMA
FROM "ADMINOBRAS".PARTIDAS_OBRAS PO,"ADMINOBRAS".OBRAS_GENERAL OG,"ADMINOBRAS".PLANES P,
"ADMINOBRAS".MUNICIPIOS_PEDANIAS M,"ADMINOBRAS".EVOLUCION_INGRESOS EI
WHERE
(PO.CI_EUROPA IS NOT NULL) AND
(P.COD_PLAN=PO.FK_COD_PLAN) AND
(OG.ANIO_COMIENZO(+)=PO.FK_ANIO_COMIENZO) AND
(OG.FK_COD_PLAN(+)=PO.FK_COD_PLAN) AND
(OG.EXPEDIENTE(+)=PO.FK_EXPEDIENTE) AND
(OG.SUBOBRA(+)=PO.FK_SUBOBRA) AND
(M.COD_MUNICIPIO(+)=OG.FK_COD_MUNICIPIO) AND
(M.COD_PEDANIA(+)=OG.FK_COD_PEDANIA) AND
(EI.FK_ANIO_COMIENZO(+)=PO.FK_ANIO_COMIENZO) AND
(EI.FK_COD_PLAN(+)=PO.FK_COD_PLAN) AND
(EI.FK_EXPEDIENTE(+)=PO.FK_EXPEDIENTE) AND
(EI.FK_SUBOBRA(+)=PO.FK_SUBOBRA) AND
(TO_NUMBER(TO_CHAR(EI.F_ING_ADMF,'YY'))=TO_NUMBER(TO_CHAR(PO.EJERCICIO,'00')))
:PARAMS
GROUP BY
PO.FK_COD_PLAN,PO.FK_ANIO_COMIENZO,PO.EJERCICIO,PO.CI_EUROPA,
PO.FK_EXPEDIENTE,
PO.FK_SUBOBRA,PO.CI_ESTADO,PO.CI_AYTOS,PO.CI_JUNTA,PO.CI_OTRAS,
P.DENOMINACION,OG.DENOMINACION,OG.FK_COD_MUNICIPIO,M.DENOMINACION
UNION ALL
SELECT
'AYUNTAMIENTO' AS APORT,PO.FK_COD_PLAN AS PLANN,PO.FK_ANIO_COMIENZO AS ANNO,PO.EJERCICIO,PO.CI_AYTOS AS AGRUP,PO.FK_EXPEDIENTE AS EXP,
PO.FK_SUBOBRA AS SUB,
PO.CI_ESTADO AS EST,PO.CI_EUROPA AS EUR,PO.CI_AYTOS AS AYTO,PO.CI_JUNTA AS JUNTA,PO.CI_OTRAS AS OTRAS,
P.DENOMINACION AS DENPLAN,OG.DENOMINACION AS DENOBRA,OG.FK_COD_MUNICIPIO,M.DENOMINACION AS DENMUNI,
NVL(SUM(EI.IMP_AYTO),0) AS SUMA
FROM "ADMINOBRAS".PARTIDAS_OBRAS PO,"ADMINOBRAS".OBRAS_GENERAL OG,"ADMINOBRAS".PLANES P,
"ADMINOBRAS".MUNICIPIOS_PEDANIAS M,"ADMINOBRAS".EVOLUCION_INGRESOS EI
WHERE
(PO.CI_AYTOS IS NOT NULL) AND
(P.COD_PLAN=PO.FK_COD_PLAN) AND
(OG.ANIO_COMIENZO(+)=PO.FK_ANIO_COMIENZO) AND
(OG.FK_COD_PLAN(+)=PO.FK_COD_PLAN) AND
(OG.EXPEDIENTE(+)=PO.FK_EXPEDIENTE) AND
(OG.SUBOBRA(+)=PO.FK_SUBOBRA) AND
(M.COD_MUNICIPIO(+)=OG.FK_COD_MUNICIPIO) AND
(M.COD_PEDANIA(+)=OG.FK_COD_PEDANIA) AND
(EI.FK_ANIO_COMIENZO(+)=PO.FK_ANIO_COMIENZO) AND
(EI.FK_COD_PLAN(+)=PO.FK_COD_PLAN) AND
(EI.FK_EXPEDIENTE(+)=PO.FK_EXPEDIENTE) AND
(EI.FK_SUBOBRA(+)=PO.FK_SUBOBRA) AND
(TO_NUMBER(TO_CHAR(EI.F_ING_AYTO,'YY'))=TO_NUMBER(TO_CHAR(PO.EJERCICIO,'00')))
:PARAMS
GROUP BY
PO.FK_COD_PLAN,PO.FK_ANIO_COMIENZO,PO.EJERCICIO,PO.CI_AYTOS,PO.FK_EXPEDIENTE,
PO.FK_SUBOBRA,PO.CI_ESTADO,PO.CI_EUROPA,PO.CI_JUNTA,PO.CI_OTRAS,
P.DENOMINACION,OG.DENOMINACION,OG.FK_COD_MUNICIPIO,M.DENOMINACION
UNION ALL
SELECT
'JUNTA' AS APORT,PO.FK_COD_PLAN AS PLANN,PO.FK_ANIO_COMIENZO AS ANNO,PO.EJERCICIO,PO.CI_JUNTA AS AGRUP,PO.FK_EXPEDIENTE AS EXP,
PO.FK_SUBOBRA AS SUB,
PO.CI_ESTADO AS EST,PO.CI_EUROPA AS EUR,PO.CI_AYTOS AS AYTO,PO.CI_JUNTA AS JUNTA,PO.CI_OTRAS AS OTRAS,
P.DENOMINACION AS DENPLAN,OG.DENOMINACION AS DENOBRA,OG.FK_COD_MUNICIPIO,M.DENOMINACION AS DENMUNI,
NVL(SUM(EI.IMP_JUNTA),0) AS SUMA
FROM "ADMINOBRAS".PARTIDAS_OBRAS PO,"ADMINOBRAS".OBRAS_GENERAL OG,"ADMINOBRAS".PLANES P,
"ADMINOBRAS".MUNICIPIOS_PEDANIAS M,"ADMINOBRAS".EVOLUCION_INGRESOS EI
WHERE
(PO.CI_JUNTA IS NOT NULL) AND
(P.COD_PLAN=PO.FK_COD_PLAN) AND
(OG.ANIO_COMIENZO(+)=PO.FK_ANIO_COMIENZO) AND
(OG.FK_COD_PLAN(+)=PO.FK_COD_PLAN) AND
(OG.EXPEDIENTE(+)=PO.FK_EXPEDIENTE) AND
(OG.SUBOBRA(+)=PO.FK_SUBOBRA) AND
(M.COD_MUNICIPIO(+)=OG.FK_COD_MUNICIPIO) AND
(M.COD_PEDANIA(+)=OG.FK_COD_PEDANIA) AND
(EI.FK_ANIO_COMIENZO(+)=PO.FK_ANIO_COMIENZO) AND
(EI.FK_COD_PLAN(+)=PO.FK_COD_PLAN) AND
(EI.FK_EXPEDIENTE(+)=PO.FK_EXPEDIENTE) AND
(EI.FK_SUBOBRA(+)=PO.FK_SUBOBRA) AND
(TO_NUMBER(TO_CHAR(EI.F_ING_JUNTA,'YY'))=TO_NUMBER(TO_CHAR(PO.EJERCICIO,'00')))
:PARAMS
GROUP BY
PO.FK_COD_PLAN,PO.FK_ANIO_COMIENZO,PO.EJERCICIO,PO.CI_JUNTA,PO.FK_EXPEDIENTE,
PO.FK_SUBOBRA,PO.CI_ESTADO,PO.CI_EUROPA,PO.CI_AYTOS,PO.CI_OTRAS,
P.DENOMINACION,OG.DENOMINACION,OG.FK_COD_MUNICIPIO,M.DENOMINACION
UNION ALL
SELECT
'OTRAS' AS APORT,PO.FK_COD_PLAN AS PLANN,PO.FK_ANIO_COMIENZO AS ANNO,PO.EJERCICIO,PO.CI_OTRAS AS AGRUP,PO.FK_EXPEDIENTE AS EXP,
PO.FK_SUBOBRA AS SUB,
PO.CI_ESTADO AS EST,PO.CI_EUROPA AS EUR,PO.CI_AYTOS AS AYTO,PO.CI_JUNTA AS JUNTA,PO.CI_OTRAS AS OTRAS,
P.DENOMINACION AS DENPLAN,OG.DENOMINACION AS DENOBRA,OG.FK_COD_MUNICIPIO,M.DENOMINACION AS DENMUNI,
NVL(SUM(EI.IMP_OTROS),0) AS SUMA
FROM "ADMINOBRAS".PARTIDAS_OBRAS PO,"ADMINOBRAS".OBRAS_GENERAL OG,"ADMINOBRAS".PLANES P,
"ADMINOBRAS".MUNICIPIOS_PEDANIAS M,"ADMINOBRAS".EVOLUCION_INGRESOS EI
WHERE
(PO.CI_OTRAS IS NOT NULL) AND
(P.COD_PLAN=PO.FK_COD_PLAN) AND
(OG.ANIO_COMIENZO(+)=PO.FK_ANIO_COMIENZO) AND
(OG.FK_COD_PLAN(+)=PO.FK_COD_PLAN) AND
(OG.EXPEDIENTE(+)=PO.FK_EXPEDIENTE) AND
(OG.SUBOBRA(+)=PO.FK_SUBOBRA) AND
(M.COD_MUNICIPIO(+)=OG.FK_COD_MUNICIPIO) AND
(M.COD_PEDANIA(+)=OG.FK_COD_PEDANIA) AND
(EI.FK_ANIO_COMIENZO(+)=PO.FK_ANIO_COMIENZO) AND
(EI.FK_COD_PLAN(+)=PO.FK_COD_PLAN) AND
(EI.FK_EXPEDIENTE(+)=PO.FK_EXPEDIENTE) AND
(EI.FK_SUBOBRA(+)=PO.FK_SUBOBRA) AND
(TO_NUMBER(TO_CHAR(EI.F_ING_OTROS,'YY'))=TO_NUMBER(TO_CHAR(PO.EJERCICIO,'00')))
:PARAMS
GROUP BY
PO.FK_COD_PLAN,PO.FK_ANIO_COMIENZO,PO.EJERCICIO,PO.CI_OTRAS,PO.FK_EXPEDIENTE,
PO.FK_SUBOBRA,PO.CI_ESTADO,PO.CI_EUROPA,PO.CI_AYTOS,PO.CI_JUNTA,
P.DENOMINACION,OG.DENOMINACION,OG.FK_COD_MUNICIPIO,M.DENOMINACION
ORDER BY 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16

3 comentarios:

Julito dijo...

Te puedes quedar con esta:
select R.*,
(select count(1)
from orden A2
where
A2.id_orden_madre = R.ID_ORDEN
and rownum = 1
) as tieneHijos
from (SELECT
ORDEN,
ID_TIPO_ORDEN,
TIPO_ORDEN,
ESTADO,
TIPO_AMBITO,
AMBITO,
SISTEMA,
CENTRAL,
EQUIPO,
SUBEQUIPO,
FECHA_CREACION,
FECHA_OBJETIVO,
TIPO_ACCION,
PRIORIDAD,
REFERENCIA_EXTERNA,
USUARIO,
GRUPO_RESPONSABLE,
CADENA1,
CADENA2,
CADENA3,
CADENA4,
FECHA1,
FECHA2,
CANTIDAD1,
CANTIDAD2,
FECHA_CLIENTE,
FECHA_ULTIMO_TRAMITE,
CADENA5,
CADENA6,
CADENA7,
CADENA8,
CHECK1,
CHECK2,
CHECK3,
CHECK4,
CHECK5,
CADENA9,
CADENA10,
CADENA11,
CADENA12,
CADENA13,
CADENA14,
CANTIDAD3,
CANTIDAD4,
CANTIDAD5,
CANTIDAD6,
CANTIDAD7,
FECHA3,
ACCESO,
FECHA_COMPROMISO,
FECHA_CLIENTE_INICIAL,
MODO_ENTRADA,
ID_ORDEN,
ID_ORDEN_MADRE,
ROWNUM as fila
FROM
( SELECT /*+ INDEX(a DK_ORDEN_1) */
A.ID_ORDEN
, A.ORDEN
, A.ID_ORDEN_MADRE
, A.ID_TIPO_ORDEN
, (select /*+ FIRST_ROWS(1) */ TIPO_ORDEN.PARAMETRO from PARAMETRO TIPO_ORDEN where A.ID_TIPO_ORDEN =
TIPO_ORDEN.ID_PARAMETRO) as TIPO_ORDEN
, A.ID_CLASE_ORDEN
, (select /*+ FIRST_ROWS(1) */ CLASE_ORDEN.PARAMETRO from PARAMETRO CLASE_ORDEN where A.ID_CLASE_ORDEN =
CLASE_ORDEN.ID_PARAMETRO) as CLASE_ORDEN
, A.ID_ESTADO
, (select /*+ FIRST_ROWS(1) */ ESTADO.PARAMETRO from PARAMETRO ESTADO where A.ID_ESTADO = ESTADO.ID_PARAMETRO) as ESTADO
, A.ID_TIPO_AMBITO
, (select /*+ FIRST_ROWS(1) */ TIPO_AMBITO.PARAMETRO from PARAMETRO TIPO_AMBITO where A.ID_TIPO_AMBITO =
TIPO_AMBITO.ID_PARAMETRO) as TIPO_AMBITO
, A.ID_AMBITO
, (select /*+ FIRST_ROWS(1) */ AMBITO.PARAMETRO from PARAMETRO AMBITO where A.ID_AMBITO = AMBITO.ID_PARAMETRO) as AMBITO
, A.ID_SISTEMA
, (select /*+ FIRST_ROWS(1) */ SISTEMA.PARAMETRO from PARAMETRO SISTEMA where A.ID_SISTEMA = SISTEMA.ID_PARAMETRO) as SISTEMA
, A.ID_CENTRAL
, (select /*+ FIRST_ROWS(1) */ CENTRAL.PARAMETRO from PARAMETRO CENTRAL where A.ID_CENTRAL = CENTRAL.ID_PARAMETRO) as CENTRAL
, A.ID_EQUIPO
, (select /*+ FIRST_ROWS(1) */ EQUIPO.PARAMETRO from PARAMETRO EQUIPO where A.ID_EQUIPO = EQUIPO.ID_PARAMETRO) as EQUIPO
, A.ID_SUBEQUIPO
, (select /*+ FIRST_ROWS(1) */ SUBEQUIPO.PARAMETRO from PARAMETRO SUBEQUIPO where A.ID_SUBEQUIPO = SUBEQUIPO.ID_PARAMETRO) as
SUBEQUIPO
, A.FECHA_CREACION
, A.FECHA_OBJETIVO
, A.ID_TIPO_ACCION
, (select /*+ FIRST_ROWS(1) */ TIPO_ACCION.PARAMETRO from PARAMETRO TIPO_ACCION where A.ID_TIPO_ACCION =
TIPO_ACCION.ID_PARAMETRO) as TIPO_ACCION
, A.PRIORIDAD
, A.REFERENCIA_EXTERNA
, A.ID_USUARIO
, (select /*+ FIRST_ROWS(1) */ U.USUARIO from USUARIO U where A.ID_USUARIO = U.ID_USUARIO) as USUARIO
, A.ID_GRUPO_RESPONSABLE
, (select /*+ FIRST_ROWS(1) */ GRUPO_RESPONSABLE.PARAMETRO from PARAMETRO GRUPO_RESPONSABLE
where A.ID_GRUPO_RESPONSABLE = GRUPO_RESPONSABLE.ID_PARAMETRO) as GRUPO_RESPONSABLE
,A.CADENA1
,A.CADENA2
,A.CADENA3
,A.CADENA4
,A.CADENA5
,A.CADENA6
,A.CADENA7
,A.CADENA8
,A.FECHA1
,A.FECHA2
,DECODE( A.CANTIDAD1, 1, 'Sí',
0, 'No',
A.CANTIDAD1
) as cantidad1
,A.CANTIDAD2
,FECHA_CLIENTE
,FECHA_ULTIMO_TRAMITE
,DECODE( A.CHECK1, 1, 'Sí',
0, 'No',
A.CHECK1
) as CHECK1
,DECODE( A.CHECK2, 1, 'Sí',
0, 'No',
A.CHECK2
) as CHECK2
,DECODE( A.CHECK3, 1, 'Sí',
0, 'No',
A.CHECK3
) as CHECK3
,DECODE( A.CHECK4, 1, 'Sí',
0, 'No',
A.CHECK4
) as CHECK4
,DECODE( A.CHECK5, 1, 'Sí',
0, 'No',
A.CHECK5
) as CHECK5
,A.CADENA9
,A.CADENA10
,A.CADENA11
,A.CADENA12
,A.CADENA13
,A.CADENA14
,A.CANTIDAD3
,A.CANTIDAD4
,A.CANTIDAD5
,A.CANTIDAD6
,A.CANTIDAD7
,A.FECHA3
,A.ID_ACCESO
, (select /*+ FIRST_ROWS(1) */ ACCESO.PARAMETRO from PARAMETRO ACCESO where A.ID_ACCESO = ACCESO.ID_PARAMETRO) as ACCESO
,A.FECHA_COMPROMISO
,A.FECHA_CLIENTE_INICIAL
,A.ID_MODO_ENTRADA
, (select /*+ FIRST_ROWS(1) */ ENTRADA.PARAMETRO from PARAMETRO ENTRADA where A.ID_MODO_ENTRADA = ENTRADA.ID_PARAMETRO) as
MODO_ENTRADA
FROM ORDEN A
WHERE (1=1) AND NOT A.id_estado IN (SELECT ID_PARAMETRO FROM PARAMETRO_DATO EF WHERE EF.ID_TIPO_DATO = 570)
AND ID_TIPO_ORDEN = 3008
AND (
(1=1 AND A.id_tipo_orden =3008 )
OR (1=1 AND A.id_tipo_orden =3011 AND A.id_ambito =28 )
)
ORDER BY ID_ORDEN ASC )
) R where fila > 0 AND fila < 201

idioto dijo...

jajajaj. Nos van a dar el premio al POST más largo y con menos contenido de la historia de los blogs jajajajaja.
Mooolaaa.

Como quieren despues que los informáticos gocemos de cierta salud mental si se nos obliga a desarrollar semejantes galimatías, por que lo crean o no esto tiene sentido para nosotros. Realmente preocupante.
Yo ya no me hago preguntas como "quien soy?"
sino "if(mysql_query(select id_humano from humanos where id_humano="idioto")) echo 'existo'
else 'no existo'".
O "adonde voy" sino "switch($destino)
case "hacia la iluminacion interior":
echo "se te fue la pinza"; break;
case "hacia el nirvana de los sentidos":
echo "sigue practicando el onanismo compulsivo que vas por buen camino";break;
default:
echo "no vas a ningun sitio que tienes una hipoteca q ni tus hijos podran terminar de pagar";
"
O "de donde vengo" sino "login: idioto, password: ********* intro.
Acceso Confirmado.
Bienvenido Idioto.
Si desea saber de donde viene por favor pinche sobre la opcion 'historial'
Publicidad:
ADSL 2MB con Timofonica desde 5mil millones de chelines. Acceder
Alarguese el Pene en un plis plas con el AlargaPollon. Pulsa Aqui
Chicas XXX te esperan para hacerte feliz. Haz Clic"

Ya no me suceden cosas sino que se producen eventos en el proceso vida_idioto ante los cuales interacciono de forma aleatoria.
Ya no hablo con la gente sino que me conecto a la wireless y a traves de ella intercambio información que como siempre es sexo,música y tonterias varias.
Ya no pulso botones alegremente simplemente por el hecho de ver como las cosas se encienden y se apagan como por arte de magia sino que me cuestiono si el encendido o el apagado ha sido provocado por un Press, un Realase, un RollOver o un RollOut.
He llegado al punto que ya nisiquiera temo la muerte puesto que no es más que un ShutDown de mi sistema operativo y siempre puedo volver a reiniciar el sistema aunque ello signifique haber perdido todo la informacion que tuviese alojada en memorial temporal o cerebro.

Lo dicho. Como pueden esperar que seamos personas mentalmente cuerdas?

Julito dijo...

Jajaja, ha sido el mejor comentario de la historia, jajaja.
Yo ahora estoy en un proceso de relajación laboral y ya no pienso si me han pinchado con el ratón o me han pulsado enter, simplemente disfruto un poco. Dentro de poco tendré que volver a la realidad e incluso a lo mejor me expreso mejor en pseudocódigo, jaja.
¿Gente sana? ¿estás seguro?