FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
(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 ) hay manera de hacerlo?
__________________
Aprendamos a ser civilizados Última edición por orfeo fecha: 27-03-2004 a las 03:34:13. |
#2
|
||||
|
||||
¡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 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 |
#3
|
||||
|
||||
Cita:
Talves me exedi...
__________________
Aprendamos a ser civilizados |
#4
|
||||
|
||||
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 |
#5
|
||||
|
||||
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 )
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
#6
|
|||
|
|||
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 ) |
#7
|
||||
|
||||
Cita:
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 |
#8
|
||||
|
||||
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 |
#9
|
||||
|
||||
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 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 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 Hasta luego.
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
#10
|
||||
|
||||
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 |
#11
|
||||
|
||||
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..)
__________________
“Plantad la semilla de la avaricia en la infértil tierra de la estupidez y obtendreis la bella flor de la mierda” (Confucio) |
#12
|
||||
|
||||
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:
Cita:
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:
Cita:
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 |
#13
|
||||
|
||||
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) |
|
|
|