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)
-   -   Resultado distinto de un query (https://www.clubdelphi.com/foros/showthread.php?t=94297)

Angel.Matilla 08-11-2019 17:59:56

Resultado distinto de un query
 
Buenas tardes. Tengo un query que se ejecuta sobre un vista en FB 2.5 y con los mismos valores da resultados diferentes. Me explico.

Si ejecuto el query así:
Código SQL [-]
SELECT A.Municipio, A.CodJun, A.CodCom, A.CodPar, 10 * A.CodPro + A.Cerrado CodPro, A.Padron, 
       A.Censo CenEle, A.Concejales, A.Actualiza, A.Partido_alcalde, A.Nombre_alcalde, A.Sede, 
       A.CodPres, A.Presidente, A.CodPort, A.Portavoz, A.Constitucion, A.TlfSede, A.Afiliados, 
       A.RatAfi, A.Observaciones 
  FROM Dl01 A 
 WHERE A.CodPrv = (SELECT Literal FROM Instalacion WHERE Etiqueta = 'Provincia') 
   AND A.Codigo = 14921
   AND A.CodJun = (SELECT FIRST 1 Codigo FROM Junta WHERE CodPrv = A.CodPrv AND Municipio = A.Codigo) 
   AND A.CodPro = (SELECT MAX(Codigo) FROM Elecciones WHERE CodPrv = A.CodPrv)
Me da este resultado

Pero si ejecuto el query así:
Código SQL [-]
SELECT * 
  FROM Dl01 A 
 WHERE A.CodPrv = (SELECT Literal FROM Instalacion WHERE Etiqueta = 'Provincia') 
   AND A.Codigo = 14921
   AND A.CodJun = (SELECT FIRST 1 Codigo FROM Junta WHERE CodPrv = A.CodPrv AND Municipio = A.Codigo) 
   AND A.CodPro = (SELECT MAX(Codigo) FROM Elecciones WHERE CodPrv = A.CodPrv)
entonces el resultado es este:

y no entiendo el por qué del distinto comportamiento el query.

Casimiro Noteví 08-11-2019 18:59:12

Pon alias para cada tabla y campo. Esos selects pueden dar resultados impredecibles, como es tu caso.
Código SQL [-]
SELECT a.* 
  FROM Dl01 A 
 WHERE A.CodPrv = (SELECT i.Literal FROM Instalacion i WHERE i.Etiqueta = 'Provincia') 
   AND A.Codigo = 14921
   AND A.CodJun = (SELECT FIRST 1 j.Codigo FROM Junta j WHERE j.CodPrv = A.CodPrv AND j.Municipio = A.Codigo) 
   AND A.CodPro = (SELECT MAX(e.Codigo) FROM Elecciones e WHERE e.CodPrv = A.CodPrv)

Angel.Matilla 08-11-2019 19:12:38

Cita:

Empezado por Casimiro Notevi (Mensaje 534367)
Pon alias para cada tabla y campo. Esos selects pueden dar resultados impredecibles, como es tu caso.

Gracias por la respuesta. Pero el problema está en el primero que he puesto, tal cual está, no devuelve nada en esos dos campos pero el segundo sí y es eso lo que me tiene mosqueado. Si uso la sintaxis que me sugieres (SELECT A.*) funciona también perfectamente, como el código que he ouetso yo.

Casimiro Noteví 08-11-2019 20:42:28

Me refiero tanto al primero como al segundo.

egostar 09-11-2019 01:08:44

Hola

Que valor tiene A.CodPro?

Es muy probable que sea null y por eso no te muestra resultados.

Saludos

Angel.Matilla 09-11-2019 09:59:31

Cita:

Empezado por egostar (Mensaje 534374)
Hola

Que valor tiene A.CodPro?

Es muy probable que sea null y por eso no te muestra resultados.

Saludos

No. Ese campo siempre tiene valor porque en la definición de la tabla tiene un SET DEFAULT. Además si fuera null saldría mal en ambos querys ya que la diferencia entre ambos es únicamente que campos selecciono: o una parte o todos los de la vista.

Angel.Matilla 09-11-2019 10:00:13

Cita:

Empezado por Casimiro Notevi (Mensaje 534370)
Me refiero tanto al primero como al segundo.

Ok. He probado en el primer query tu sugerencia y me da el mismo resultado erróneo que mostré arriba.

Casimiro Noteví 09-11-2019 12:06:38

Más no podemos hacer sin la BD :/

Angel.Matilla 09-11-2019 12:07:59

Lo sé y os agradezco la ayuda.

Casimiro Noteví 09-11-2019 12:35:22

Ve paso a paso, primero:
Código SQL [-]
SELECT A.Municipio, A.CodJun, A.CodCom, A.CodPar, ((10 * A.CodPro)+A.Cerrado) CodPro, A.Padron, 
       A.Censo CenEle, A.Concejales, A.Actualiza, A.Partido_alcalde, A.Nombre_alcalde, A.Sede, 
       A.CodPres, A.Presidente, A.CodPort, A.Portavoz, A.Constitucion, A.TlfSede, A.Afiliados, 
       A.RatAfi, A.Observaciones 
FROM Dl01 A
y
Código SQL [-]
SELECT A.* 
FROM Dl01 A


Si el resultado es igual, por lógica debe serlo, da el siguiente paso:
Código SQL [-]
SELECT A.Municipio, A.CodJun, A.CodCom, A.CodPar, ((10 * A.CodPro)+A.Cerrado) CodPro, A.Padron, 
       A.Censo CenEle, A.Concejales, A.Actualiza, A.Partido_alcalde, A.Nombre_alcalde, A.Sede, 
       A.CodPres, A.Presidente, A.CodPort, A.Portavoz, A.Constitucion, A.TlfSede, A.Afiliados, 
       A.RatAfi, A.Observaciones 
FROM Dl01 A 
WHERE A.CodPrv = (SELECT i.Literal FROM Instalacion i WHERE i.Etiqueta = 'Provincia')
y
Código SQL [-]
SELECT a.* 
FROM Dl01 A 
WHERE A.CodPrv = (SELECT i.Literal FROM Instalacion i WHERE i.Etiqueta = 'Provincia')
Que también deben ser iguales, así que ahora el siguiente paso... y así.
Pero, no olvides el alias en todos los campos cuando hay más de una tabla involucrada.

Angel.Matilla 09-11-2019 12:36:54

Cita:

Empezado por Casimiro Notevi (Mensaje 534379)
Ve paso a paso, primero:

En cuanto pueda haré la prueba y os digo como ha ido.


La franja horaria es GMT +2. Ahora son las 06:56:39.

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