PDA

Ver la Versión Completa : Error incomprensible en un query


Angel.Matilla
18-06-2019, 18:59:47
Primero perdón por el "ladrillo" de mensaje. Con tablas en FB 2.5 tengo este query:
SELECT A.Nombre, B.Codigo, B.Distrito, B.Seccion, B.Mesa, C.Censo, SUM(D.Votos) Votos
FROM Poblacion A, Mesas B, DatMes C
LEFT JOIN Resultados D ON C.Codigo = D.Mesa AND C.Proceso = D.Proceso
WHERE A.Codigo = B.Municipio
AND B.Codigo = C.Codigo AND C.Proceso = :Proceso
GROUP BY A.Nombre, B.Codigo, B.Distrito, B.Seccion, B.Mesa, C.Censo
ORDER BY Nombre, Distrito, Seccion, Mesa
Las tablas que emplea son estas:
1. Poblacion
CREATE TABLE Poblacion (CodPrv VARCHAR(3) DEFAULT '99' NOT NULL, Codigo INTEGER NOT NULL, Nombre VARCHAR(65) NOT NULL,
Cpostal VARCHAR(10) NOT NULL, Pais VARCHAR(2) DEFAULT 'ES', CONSTRAINT PK_POBLACION PRIMARY KEY (CODPRV,CODIGO))
2. Mesas
CREATE TABLE Mesas (CodPrv VARCHAR(3), Codigo INTEGER NOT NULL, Municipio INTEGER NOT NULL, Distrito SMALLINT NOT NULL,
Seccion SMALLINT NOT NULL, Mesa VARCHAR(2) DEFAULT 'U' NOT NULL, Censo INTEGER, CONSTRAINT PK_MESAS PRIMARY KEY (CODPRV,CODIGO))
3. DatMes
CREATE TABLE DatMes (CodPrv VARCHAR(3) DEFAULT '99' NOT NULL, Codigo INTEGER NOT NULL, Proceso INTEGER NOT NULL,
Censo INTEGER DEFAULT 1 NOT NULL, CONSTRAINT PK_DATMES PRIMARY KEY (CODPRV,CODIGO,PROCESO))
4. Resultados
CREATE TABLE Resultados (CodPrv VARCHAR(3) DEFAULT '99' NOT NULL, Proceso INTEGER NOT NULL, Mesa INTEGER NOT NULL,
Partido INTEGER DEFAULT 1 NOT NULL, Votos INTEGER NOT NULL, CONSTRAINT PK_RESULTADOS PRIMARY KEY (CODPRV,PROCESO,MESA,PARTIDO))
En la tabla resultados sólo hay registros con código de proceso (C.Proceso) igual a 38.

Si ejecuto el query, tanto desde la aplicación como desde IBManager asignando valores 38 ó 39 al parámetro Proceso el mismo se ejecuta; con el valor 38 me da el valor que está grabado, con valor 39 me devuelve tantas filas como debería ser pero en todas la columna Votos está a Null ya que no hay valores. Sin embargo si hago la prueba con el valor 40 me devuelve este error:
No current record for fetch operation.

SQL Code: -508
IB Error Number: 335544348
No current record for fetch operation.

SQL Code: -508
IB Error Number: 335544348
En la tabla en la que creo que puede estar apareciendo el error (DatMes) he comprobado que hay datos para ese código 40:
Codigo Proceso Censo
1 40 620

TOPX
18-06-2019, 22:44:39
FROM Poblacion A, Mesas B, DatMes C
LEFT JOIN Resultados D ON C.Codigo = D.Mesa AND C.Proceso = D.Proceso


Esa sintaxis para consultar cuatro tablas, ¿sí es permitida? Pregunto porque no lo sé.

De todas maneras yo plantearía la consulta más uniforme:
o especificando cada tabla con su respectivo JOIN
o incluyendo todas las tablas en el FROM.
-

Angel.Matilla
19-06-2019, 10:31:18
Esa sintaxis para consultar cuatro tablas, ¿sí es permitida? Pregunto porque no lo sé.
Gracias por la respuesta. Al final anoche di con el error y es que estaba referenciando mal una de las tablas. Al margen de eso la sintaxis es correcta; lo que planteas de meter todas las tablas en el FROM no me valdría porque en la tabla Resultados puede o no haber datos para las mesas y necesito sacar todas las mesas, tengan o no datos grabados en esa tabla. Y poner a cada una de ellas un JOIN no sería solución: Las tres primeras tablas siempre van a tener todos los datos por lo tanto sé seguro que de ellas siempre van a salir resultados en el query.

movorack
19-06-2019, 18:15:02
Firebird te permite mezclar la forma en que haces los joins, pero por ej MSSQL no logra resolver los nombres de campo dentro del join. Y aunque el motor te permita hacer los joins de esta manera, en pro de la legibilidad, recomendaría mantener una sola forma de hacer los joins.


SELECT
A.FechaPago, A.Empleado, A.Contrato,
A.CodigoConcepto, B.NombreConcepto,
A.ValorPago
FROM Pagos A, Conceptos B
INNER JOIN GruposConceptos C
ON A.Empresa = C.Empresa
AND A.CodigoConcepto = C.CodigoConcepto
AND C.CodigoGrupo = 50
WHERE A.Empresa = B.Empresa
AND A.CodigoConcepto = B.CodigoConcepto
AND A.Empresa = 9
AND A.FechaPago BETWEEN '01/01/2010' AND '31/12/2019'
ORDER BY A.FechaPago, A.Empleado, A.Contrato,
C.PrioridadEnGrupo, B.TipoConcepto, A.CodigoConcepto



SELECT
A.FechaPago, A.Empleado, A.Contrato,
A.CodigoConcepto, B.NombreConcepto,
A.ValorPago
FROM Pagos A
INNER JOIN Conceptos B
ON A.Empresa = B.Empresa
AND A.CodigoConcepto = B.CodigoConcepto
INNER JOIN GruposConceptos C
ON A.Empresa = C.Empresa
AND A.CodigoConcepto = C.CodigoConcepto
AND C.CodigoGrupo = 50
WHERE A.Empresa = 9
AND A.FechaPago BETWEEN '01/01/2010' AND '31/12/2019'
ORDER BY A.FechaPago, A.Empleado, A.Contrato,
C.PrioridadEnGrupo, B.TipoConcepto, A.CodigoConcepto


Es de anotar, que solo es legibilidad. El plan de ejecución es igual para ambas consultas