Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-11-2023
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Filtrar resultados en un query

Para el mismo mi query de mi pregunta anterior (¿Por qué no usa el índice?)
Código SQL [-]
SELECT DISTINCT A.Codigo, A.Nombre, COALESCE(RDB$GET_CONTEXT('USER_TRANSACTION', 'MUNICIPIO'), 1) Municipio,
       RDB$SET_CONTEXT('USER_TRANSACTION', 'MUNICIPIO', 
           (SELECT DISTINCT COALESCE(Municipio, 1) FROM Mesas WHERE CodPrv = B.CodPrv AND Codigo = B.Mesa))
  FROM Partidos A
  LEFT JOIN Resultados B ON A.CodPrv = B.CodPrv AND A.Codigo = B.Partido AND B.Proceso = :Proceso
 WHERE A.CodPrv = :PrvIns AND A.Codigo > 0
 ORDER BY Municipio, A.Nombre
me da, por ejemplo, este resultado:

El valor de la columna Municipio igual a 1 significa población desconocida; ¿cómo puedo evitar que se muestren esos valores? He probado con esta condición:
Código SQL [-]
AND COALESCE(RDB$GET_CONTEXT('USER_TRANSACTION', 'MUNICIPIO'), 1) > 1
y me devuelve un query vacío. Y si uso
Código SQL [-]
AND Municipio > 1
me dice que la columna Municipio es desconocida.
Responder Con Cita
  #2  
Antiguo 04-11-2023
aposi aposi is offline
Miembro
 
Registrado: dic 2006
Posts: 146
Poder: 18
aposi Va por buen camino
prueba:


Código SQL [-]
 WHERE A.CodPrv = :PrvIns AND A.Codigo > 0
 having municipio > 1  
ORDER BY Municipio, A.Nombre
Responder Con Cita
  #3  
Antiguo 05-11-2023
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
No entiendo porqué utilizas CONTEXT.
¿No es más fácil utilizar un SUBSELECT?
Código SQL [-]
SELECT DISTINCT A.Codigo, A.Nombre, 
/* COALESCE para que si el subselect devuelve nulo (no existe ningún registro con esa condición), muestre un 1. */
/* FIRST 1 para que me devuelva solo un municipio si hubiera más de uno */
/* ORDER BY para que el registro que devuelva sea siempre el primero, en orden de municipio */
COALESCE(
         (SELECT FIRST 1 Municipio FROM Mesas 
          WHERE 
          CodPrv = B.CodPrv AND 
          Codigo = B.Mesa 
          ORDER BY Municipio), 1)
FROM Partidos A
LEFT JOIN Resultados B ON A.CodPrv = B.CodPrv AND A.Codigo = B.Partido AND B.Proceso = :Proceso
WHERE 
A.CodPrv = :PrvIns AND 
A.Codigo > 0 AND
/* EXISTS indica si existe al menos un registro en la tabla con esa condición */
exists((SELECT Municipio FROM Mesas WHERE CodPrv = B.CodPrv AND Codigo = B.Mesa))
/* Indico el tercer campo para ordenar, que se corresponde con el resultado del subselect */
ORDER BY 3 /*Municipio*/, A.Nombre

Última edición por duilioisola fecha: 05-11-2023 a las 22:03:38.
Responder Con Cita
  #4  
Antiguo 06-11-2023
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Cita:
Empezado por aposi Ver Mensaje
Código SQL [-]
 WHERE A.CodPrv = :PrvIns AND A.Codigo > 0
 having municipio > 1  
ORDER BY Municipio, A.Nombre
HAVING Sólo funciona si hay un GROUP BY
Responder Con Cita
  #5  
Antiguo 06-11-2023
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Cita:
Empezado por duilioisola Ver Mensaje
No entiendo porqué utilizas CONTEXT.
¿No es más fácil utilizar un SUBSELECT?
Te contesto aquí a las dos sugerencias que me haces sobre CONTEXT, en este hilo y en el otro. Tienes razón, pero como estoy probando diversas sintaxis del query por eso esta estructura.
Entiendo la idea que me sugieres pero me da este error:
Cita:
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 16, column 2.
Exists.
(1,154 sec)
en:
Cita:
Empezado por duilioisola Ver Mensaje
Código SQL [-]
exists ((SELECT Municipio FROM Mesas WHERE CodPrv = B.CodPrv AND Codigo = B.Mesa))
Seguiré probando por este camino que me parece mucho más lógico y sobre todo sencillo que el que estaba usando yo.
Responder Con Cita
  #6  
Antiguo 06-11-2023
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Vale, ya encontré lo que pasa.
Cita:
Empezado por duilioisola Ver Mensaje
Código SQL [-]
exists ((SELECT Municipio FROM Mesas WHERE CodPrv = B.CodPrv AND Codigo = B.Mesa))
Por lo que sea no tolera los dos paréntesis. Efectivamente es una estructura mucho más lógica y rápida. Muchas gracias por la idea.
Responder Con Cita
  #7  
Antiguo 06-11-2023
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Puedes quitar un par de paréntesis.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Filtrar resultados de una tabla con un campo tipo TEXT SQLite MLROJO Tablas planas 1 20-06-2014 18:32:00
Agrupar resultados de un query Angel.Matilla Tablas planas 1 05-02-2014 19:46:11
Mostrar resultados query SQL aikai SQL 6 15-11-2007 15:16:51
modificar resultados de un query en la BD Choclito Conexión con bases de datos 2 15-11-2006 00:12:50
Validar resultados de Query Supermagayin SQL 4 20-07-2006 23:36:21


La franja horaria es GMT +2. Ahora son las 23:34:10.


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
Copyright 1996-2007 Club Delphi