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.354
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: 149
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.757
Poder: 21
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 23: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.354
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
  #5  
Antiguo 06-11-2023
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.354
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
  #6  
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.257
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Puedes quitar un par de paréntesis.
Responder Con Cita
  #7  
Antiguo 06-11-2023
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.354
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
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 19:32:00
Agrupar resultados de un query Angel.Matilla Tablas planas 1 05-02-2014 20:46:11
Mostrar resultados query SQL aikai SQL 6 15-11-2007 16:16:51
modificar resultados de un query en la BD Choclito Conexión con bases de datos 2 15-11-2006 01:12:50
Validar resultados de Query Supermagayin SQL 4 21-07-2006 00:36:21


La franja horaria es GMT +2. Ahora son las 00:50:34.


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