Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 26-03-2004
Avatar de orfeo
orfeo orfeo is offline
Miembro
 
Registrado: may 2003
Posts: 99
Poder: 22
orfeo Va por buen camino
(DBE+.dbf) Como consulto con IN sobre multiples campos?

Hola tengo qe hacer una consulta con IN usando dos campos como elemento del conjunto
Estoy usando DBE+DBase, les escribo un ejemplo simplificado de la consulta

Código:
      SELECT  count(DISTINCT ex.doc_numero)
      FROM    expalu  ex
      WHERE  "condiciones" and 
                 (ex.doc_numero,ex.carrera) IN

                                  (SELECT  ins.doc_numero,ins.carrera
                                   FROM   insren as ins
                                   WHERE   "condiones"
                                   Group By ins.doc_numero,ins.carrera
                                    HAVING 6<= count(DISTINCT cod_ren) and count(DISTINCT cod_ren) <=10
                                   )
esta consulta no anda colocando como elemento (ex.doc_numero,ex.carrera), he probado concatenar los campos con ||, pero tampoco lo he logrado.

hay manera de hacerlo?
__________________
Aprendamos a ser civilizados

Última edición por orfeo fecha: 27-03-2004 a las 03:34:13.
Responder Con Cita
  #2  
Antiguo 26-03-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
¡Por dios! Una cosa es colocar títulos descriptivos y otra hacer la pregunta en el título. Por favor corrígelo.

En cuanto a lo que pides te pongo este fragmento de la ayuda del sql local:

Código:
Indicates wether a value exists in a set of values
de manera que IN sirve sólo para verificar que un único valor está o no en un conjunto de valores.

Dices que la concatenación no sirve pero no dices por qué. ¿Te marca algún error o no te da el resultado esperado? ¿Estas concatenando sólo el valor a verificar o tambien los campos de la subconsulta?

// Saludos
Responder Con Cita
  #3  
Antiguo 27-03-2004
Avatar de orfeo
orfeo orfeo is offline
Miembro
 
Registrado: may 2003
Posts: 99
Poder: 22
orfeo Va por buen camino
Cita:
Empezado por roman
¡Por dios! Una cosa es colocar títulos descriptivos y otra hacer la pregunta en el título. Por favor corrígelo.
// Saludos
Bueno, la verdad es que simpre intento poner los subject lo mas descriptivos posbles, yo tambien odio subject como "URGENTRE!!", 'Como algo esto', 'nesecito ayuda' y otros.
Talves me exedi...
__________________
Aprendamos a ser civilizados
Responder Con Cita
  #4  
Antiguo 27-03-2004
Avatar de orfeo
orfeo orfeo is offline
Miembro
 
Registrado: may 2003
Posts: 99
Poder: 22
orfeo Va por buen camino
Roman talves no me explique bien..

Como habras leido en el LOCALSQL.HLP

'The comparison set can also be the result set from a subquery. The subquery may return multiple rows, but must only return a single column for comparison'

Con esto dice que es imposible un (cam1,camp2) IN (cam1,cam2) , como te decia intente un (cam1||camp2) IN (cam1||cam2) pero tira un error de sintaxis.
Yo lo que quiero es ver si hay algun truco para lograr hacer la comparacion, dado que en los ejemplos no hay dada que me sirva.

Talves lo mas seguro sera armar una pregunta y envairla al foro SQL pidiendo ayuda para la re-escritura de la consulta...

Gracias, de todos modos
__________________
Aprendamos a ser civilizados
Responder Con Cita
  #5  
Antiguo 27-03-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Podes concatenar los campos... pero esto regularmente tiene una grave consecuencia en el desempeño... dependerá del tamaño de tu tabla si sea práctico o no...

Código:
      SELECT  count(DISTINCT ex.doc_numero)
      FROM    expalu  ex
      WHERE  "condiciones" and 
                 ex.doc_numero||ex.carrera IN
                                  (SELECT  ins.doc_numero||ins.carrera
                                   FROM   insren as ins
                                   WHERE   "condiones"
                                   Group By ins.doc_numero,ins.carrera
                                    HAVING 6<= count(DISTINCT cod_ren) and count(DISTINCT cod_ren) <=10
                                   )
Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #6  
Antiguo 27-03-2004
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
Bueno, como veo que el hilo es más bien una consulta de SQL, vamos a moverlo a susodicho foro

A parte, otra posible solución (aunque me gusta más la de Juan Antonio y tambien todo depende de lo que quieras conseguit) sería lanzar dos selects anidados, es decir

Código:
SELECT  count(DISTINCT ex.doc_numero)
      FROM    expalu  ex
      WHERE  "condiciones" and 
                 ex.doc_numero IN
                                  (SELECT  ins.doc_numero
                                   FROM   insren as ins
                                   WHERE   "condiones"
                                   Group By ins.doc_numero,ins.carrera
                                    HAVING 6<= count(DISTINCT cod_ren) and count(DISTINCT cod_ren) <=10
                                   ) AND
                 ex.carrera IN
                                  (SELECT  ins.carrera
                                   FROM   insren as ins
                                   WHERE   "condiones"
                                   Group By ins.doc_numero,ins.carrera
                                    HAVING 6<= count(DISTINCT cod_ren) and count(DISTINCT cod_ren) <=10
                                   )
Responder Con Cita
  #7  
Antiguo 28-03-2004
Avatar de orfeo
orfeo orfeo is offline
Miembro
 
Registrado: may 2003
Posts: 99
Poder: 22
orfeo Va por buen camino
Cita:
Empezado por cadetill
Bueno, como veo que el hilo es más bien una consulta de SQL, vamos a moverlo a susodicho foro
Si me Temo que es lo que termino sindo..,
Pero no la muevas, voy a re-escribier la pregunta (pidiendo una ayuda para re-escrivir la consulta) y la publico en el foro SQL.

Antes voy a probar campo1||campo2 sin los parecntesis como indica jachguate, la verdad que en este momento no recuerdo si probe sin parentesis

gracias..
__________________
Aprendamos a ser civilizados
Responder Con Cita
  #8  
Antiguo 28-03-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Sí es posible usar los campos concatenados para hacer la consulta pero me parece que el problema va a estar en la cláusula GROUP BY. A mi me el BDE indicó que no se pueden usar estos campos en group by (aun cuando el group by no use la concatenación).

// Saludos
Responder Con Cita
  #9  
Antiguo 29-03-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Hola.

El problema de lo planteado por el amigo cadetill, es que pueden colarse combinaciones no deseadas.

Supongamos que tenemos...

Código:
  Tabla1

  Nombre   Apellido
  ======   ========
  juan     perez
  juan     gomez
  jose     juarez
  jose     gomez
  juan     castillo
  
  Tabla2

  Nombre   Apellido
  ======   ========
  juan     perez
  jose     juarez
  pedro    gomez
la opción mia, concatenando los campos filtrará asi:

Código:
select *
  from tabla1
 where nombre||apellido in (
         select nombre||apellido
           from tabla2)

  Query1

  Nombre   Apellido
  ======   ========
  juan     perez
  juan     gomez
  jose     juarez
  jose     gomez
  juan     castillo
en cambio la opción de cadetill filtraría asi:

Código:
select *
  from tabla1
 where nombre in (
         select nombre
           from tabla2)
   and apellido in (
         select apellido
           from tabla2)


  Query2

  Nombre   Apellido
  ======   ========
  juan     perez
  juan     gomez
  jose     juarez
  jose     gomez
  juan     castillo
Dependerá de las necesidades cual de las dos sea aplicable, aunque en este caso, me parece que la concatenación es la única opción... y vale la pena establecer la diferencia.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #10  
Antiguo 29-03-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
En lo dicho por román... al menos en el caso planteado hoy no se usa group by así que no creo que haya problema.

Si la concatenación está soportado o no, dependerá en cualquier caso del Motor. En oracle no dará ningun problema, incluso puede hacerse un group by por funciones almacenadas y otras cosas interesantes, mientras que en interbase/firebird, me parece que si. En tablas planas, habrá que hacer una pequeña prueba.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #11  
Antiguo 29-03-2004
Avatar de haron
haron haron is offline
Miembro
 
Registrado: may 2003
Ubicación: Las Palmas de Gran Canaria
Posts: 310
Poder: 22
haron Va por buen camino
este problema siempre lo he solucionado asi

Código:
select *
from tabla1 t1
where exists(
  select null
  from tabla2 t2
  where t2.doc_numero=t1.doc_numero and t2.carrera=t1.carrera
  and etc.. etc..)
en oracle funciona bien. no se si con el BDE+DBase funcionara. pruebalo a ver.
__________________
“Plantad la semilla de la avaricia en la infértil tierra de la estupidez y obtendreis la bella flor de la mierda”
(Confucio)
Responder Con Cita
  #12  
Antiguo 31-03-2004
Avatar de orfeo
orfeo orfeo is offline
Miembro
 
Registrado: may 2003
Posts: 99
Poder: 22
orfeo Va por buen camino
Como an respondido un monton (CRACIAS) tomandose el trabajo de pensar en la consulta, me siento responsable de responderles a todos.. (por simplicidad se los responto a todos en este mensaje)



Cita:
Empezado por jachguate
Podes concatenar los campos... pero esto regularmente tiene una grave consecuencia en el desempeño... dependerá del tamaño de tu tabla si sea práctico o no...
Tu ejemplo anda perfecto si sacamos el 'Group By' , al parecer este ultimo no soporta || (ver siguiente)



Cita:
Empezado por roman
Sí es posible usar los campos concatenados para hacer la consulta pero me parece que el problema va a estar en la cláusula GROUP BY. A mi me el BDE indicó que no se pueden usar estos campos en group by (aun cuando el group by no use la concatenación).
El DBE pide que los campos usados en group by se proyecten en el select y solo ellos son posibles proyectar.
un group by ins.doc_numero||ins.carrera tira "Capacidad no soportada"

Lo que he pensado es crear un campo generado (no recuerdo nombre) desde un TQuery que sea la concatenacion y luego probar..., dichos campos se ven como si fuesesn realales.

Cita:
Empezado por jachguate
El problema de lo planteado por el amigo cadetill, es que pueden colarse combinaciones no deseadas.
Supongamos que tenemos...
si verdad conceptualmente son dos cosas distintas, yo nesecito que mis conjuntos esten compuestos por pares de elementos.



Cita:
Empezado por haron
este problema siempre lo he solucionado asi
.....
La verdad no comprendo la consulta, por ahora no comprendo su relacion con lo que nececito (luego la pienzo mejor).
Donde deberia poner el group by y el having?
en este momento la veo como un JOIN comun, y a mi no me sirve porque primero tengo que sacar un grupo de alumnos que an aprobado cierto rango de materias y luego a estos relacionarlos con otras tablas.


Les dije gracias?
__________________
Aprendamos a ser civilizados
Responder Con Cita
  #13  
Antiguo 31-03-2004
Avatar de haron
haron haron is offline
Miembro
 
Registrado: may 2003
Ubicación: Las Palmas de Gran Canaria
Posts: 310
Poder: 22
haron Va por buen camino
prueba con esto a ver si te sirve:

Código:
      SELECT  count(DISTINCT ex.doc_numero)
      FROM    expalu  ex
      WHERE  "condiciones" and exists

                                  (SELECT  null
                                   FROM   insren as ins
                                   WHERE ins.doc_numero=ex.doc_numero AND ins.carrera=ex.carrera
                                   AND "condiones"
                                   Group By ins.doc_numero,ins.carrera
                                    HAVING 6<= count(DISTINCT cod_ren) and count(DISTINCT cod_ren) <=10)
__________________
“Plantad la semilla de la avaricia en la infértil tierra de la estupidez y obtendreis la bella flor de la mierda”
(Confucio)
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


La franja horaria es GMT +2. Ahora son las 16:35:55.


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