Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Error incomprensible en un query (https://www.clubdelphi.com/foros/showthread.php?t=94010)

Angel.Matilla 18-06-2019 18:59:47

Error incomprensible en un query
 
Primero perdón por el "ladrillo" de mensaje. Con tablas en FB 2.5 tengo este query:
Código SQL [-]
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
Código SQL [-]
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
Código SQL [-]
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
Código SQL [-]
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
Código SQL [-]
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:
Cita:

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:
Cita:

Codigo Proceso Censo
1 40 620


TOPX 18-06-2019 22:44:39

Cita:

Empezado por Angel.Matilla (Mensaje 532453)
Código SQL [-]
  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

Cita:

Empezado por TOPX (Mensaje 532456)
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.

Código SQL [-]
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

Código SQL [-]
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


La franja horaria es GMT +2. Ahora son las 15:26:09.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi