Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   (DBE+.dbf+subquery) Como hago un (capo1,campo2) IN (Select campo1,campo2, FR...) (https://www.clubdelphi.com/foros/showthread.php?t=8604)

orfeo 26-03-2004 19:16:47

(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?

roman 26-03-2004 19:25:05

¡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

orfeo 27-03-2004 03:30:24

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. :p
Talves me exedi...

orfeo 27-03-2004 04:00:11

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

jachguate 27-03-2004 09:42:41

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.

;)

__cadetill 27-03-2004 12:49:14

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
                                  )


orfeo 28-03-2004 05:08:08

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

gracias..

roman 28-03-2004 22:37:37

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

jachguate 29-03-2004 21:19:23

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.

;)

jachguate 29-03-2004 21:22:54

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.

;)

haron 29-03-2004 22:37:45

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.

orfeo 31-03-2004 23:06:00

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? :p

haron 31-03-2004 23:53:05

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)



La franja horaria es GMT +2. Ahora son las 08:00:17.

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