[Gvsig_desarrolladores] Sentencia Select

Jose Manuel Vivó (Chema) josemanuel.vivo en iver.es
Lun Mayo 21 08:31:11 CEST 2007


Hola Jaime:

  Pues efectivamente, no esta soportado. Ten en cuenta que, el parser de SQL 
que estás usando para esa sentencia está implementado dentro de la librería 
GDBMS que usa gvSIG. No es un gestor de base de dados y no tiene en cuenta si 
existe uno detrás de las fuentes.

  Pues creo que el método de recorrer las tablas es lo único que te queda. 
Pero para optimizarlo, igual podrías construirte un índice a mano sobre la 
tabla B (o sobre la A, dependiendo los registros) y así solo necesitarías 
recorrer tantas veces una tabla. Además, si esta busqueda se repite, igual te 
conviene guardar ese índice en memoria y las busquedas resultarán bastante 
rápidas.

  Yo te sugeriría construir un HashMap cuya clave serían los campos por los 
que comparas y el valor el índice del registro (si hay varios en vez de un 
entero usa un ArrayList de enteros)



El Viernes 18 Mayo 2007 21:43, Jaime Traver escribió:
> Hola a todos:
>
> Tengo una duda acerca de la sentencia select, necesito saber si se puede
> realizar un CROSS JOIN de dos tablas, *A y *B. No se, si no está soportado
> o  tengo mal creada la sentencia select, porque tengo un error de parseador
> SQL.
>
>         FLayer layerTolocate = mapControl.getMapContext
> ().getLayers().getLayer(0);
>         AlphanumericData capa = (AlphanumericData)layerTolocate;
>         ProjectTable projectTable =
> getProjectTable((String)tableComboBox.getSelectedItem());
>         SelectableDataSource sds_v,sds_t=null;
>
>         //Obtenemos los índices de las filas
>         DataSource ds;
>
>         try {
>             sds_v = capa.getRecordset();
>             sds_t = projectTable.getModelo().getRecordset();
>             String name_vista = sds_v.getName();
>             String name_tabla = sds_t.getName();
>             ds = LayerFactory.getDataSourceFactory().executeSQL("select *
> from " + name_vista +" cross join "+name_tabla+" where "+name_vista+".TIPO
> = "+name_tabla+".TVIAB and "+name_vista+".TEXT_1 = "+name_tabla+".NVIAB 
> and "+name_vista+".TEXT = "+name_tabla+".NCALBN; " ,
> DataSourceFactory.MANUAL_OPENING);
>             long[] selectedIndex = ds.getWhereFilter();
>
>             for (int i=0 ; i<selectedIndex.length ; i++){
>                 System.out.print("\n FILA " + selectedIndex[i] + " ");
>                 for (int j=0 ; j<sds_v.getFieldCount() ; j++){
>                     System.out.print(sds_v.getFieldName(j));
>                     System.out.print(": ");
>
>                     System.out.print(sds_v.getFieldValue(selectedIndex[i],
> j));
>                     System.out.print(" ");
>                 }
>             }
>
> He intentado tomar estas dos tablas (*A y *B) y recorrer por cada registro
> de  *A todos los de  *B, como intuia, es un proceso muy lento, querria
> saber en caso de que el croos join no estuviera soportado que otras
> opciones me quedarian.
>
> Un saludo a todos. Gracias
>
>
> *A = Tabla que forma parte del Tipo de documento Vista
> *B = Talba que forma parte de Tipo de documento Tabla

-- 
=============
Jose Manuel Vivó (Chema)
Equipo de gvSIG

IVER T.I. S.A.
C/ Salamanca, 50-52
46005-Valencia
Tlf.+34963163400
Spain
www.iver.es
www.gvsig.com



Más información sobre la lista de distribución gvSIG_desarrolladores